更新后,Nhibernate从视图中获得相同的结果

时间:2019-07-12 08:38:46

标签: c# nhibernate fluent-nhibernate stateless-session

我遇到了NHibernate的问题。我运行了以下查询:

  1. SELECT * FROM ClientInvoiceView
  2. UPDATE Invoice SET status = 1
  3. SELECT * FROM ClientInvoiceView

尽管UPDATE,第二个SELECT返回的结果与第一个相同。

我找到了解决方案,但我认为这并不理想。使用无状态会话可以正常工作。 我还尝试过在UPDATE之后刷新会话,但这是行不通的。

我正在使用NHibernate 3.3.1.4版和Fluent NHibernate 1.3.0.733版。

ClientInvoiceView entity = null;
IQueryOver<ClientInvoiceView, ClientInvoiceView> query = _session.QueryOver(() => entity);
IPagedList<ClientInvoiceView> list = query.Take(10).Skip(0).Future();

invoice.Status = _session.Load<InvoiceStatus>(1);
_session.Update(invoice);

IQueryOver<ClientInvoiceView, ClientInvoiceView> query2 = _session.QueryOver(() => entity);
IPagedList<ClientInvoiceView> list2 = query2.Take(10).Skip(0).Future();

1 个答案:

答案 0 :(得分:0)

我看不到任何代表您第二步UPDATE Invoice SET status = 1的NHibernate代码。 .Load.Update的中间部分实际上什么也没做。它不会将状态更改为1。它只是在加载InvoiceStatus实体且其ID ='1';可能已经在较早的调用中加载了。然后,您只需将同一实体附加到同一会话-完全不需要。

如果要更改Status = 1,则必须修改适当实体实例的适当属性。如下所示:

//Just a guess; do not know which entity and which property to update...
invoice.Status = _session.Load<InvoiceStatus>(1);
invoice.Status.StatusColumn = 1;//<==This will change the value of entity; not executed the query yet
_session.Update(invoice);
_session.Flush();//Do not know your flushing implementation; this will actually execute the query.

但是,即使这样做,这也只会更改单个实体的值。因此,您实际上正在执行查询:

UPDATE Invoice SET status = 1 WHERE Id = 1

我认为这不是您想要的。

您正在寻找批量更新。您可以通过HQL或SQL来实现。但是请注意,这两个API均未反映对内存中实体的更改。更好的方法是在单独的会话上执行每个调用。您应该参考thisthis帖子。