我遇到了NHibernate的问题。我运行了以下查询:
SELECT * FROM ClientInvoiceView
UPDATE Invoice SET status = 1
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();
答案 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均未反映对内存中实体的更改。更好的方法是在单独的会话上执行每个调用。您应该参考this和this帖子。