我正在使用NHibernate和Fluent NHibernate。
我有代码,我开始一个事务,然后我进入一个创建几个对象的循环。对于每个对象,我检查某些条件。如果满足这些条件,则在对象上执行session.SaveOrUpdate()。在循环结束时,我发出一个提交事务。
我在session.SaveOrUpdate命令上设置了一个断点,证明它已经 从不 (因为条件未被任何对象所满足)环)。 然而,当提交事务时,对象将被保存!
我正在使用AuditInterceptor并在OnSave方法中设置了断点。它被调用,但堆栈跟踪只追溯到提交事务的语句。
此时没有任何类型的对象已经对它们执行了SaveOrUpdate,因此级联不能解释它。
为什么NHibernate会保存这些对象?
答案 0 :(得分:12)
来自NHibernate ISession.Update主题:
Hibernate维护对象的缓存 已插入,更新或 删除。它还维护着缓存 已查询的对象 数据库。这些对象是 称为持久对象 只要是EntityManager就可以了 用于获取它们仍然是活跃的。 这意味着任何改变 这些对象在一个范围内 交易是自动的 交易时持续存在 承诺。这些更新是隐含的 在交易的边界内 而且你不必明确地打电话 任何持久化值的方法。
问)我还需要做Save和 更新内部交易?
只有对象才需要Save() 不持久(如新的 对象)。您可以使用更新来带来 被驱逐的物体 进入会议。
来自NHibernate's automatic (dirty checking) update behaviour :
我刚刚发现,如果我得到了 来自NHibernate会话的对象和 更改对象的属性, NHibernate会自动更新 没有我的提交对象 调用Session.Update(myObj)!
答案:您可以将Session.FlushMode设置为 FlushMode.Never。这将使你的 操作显式ie:on tx.Commit()或session.Flush()。 当然这仍然会更新 提交/刷新时的数据库。如果你这样做 不想要这种行为,然后打电话 session.Evict(yourObj),它会 然后成为瞬态和NHibernate 不会为它发出任何db命令。
答案 1 :(得分:5)
这与会话刷新模式为FlushMode.Commit(默认)有关。提交事务时,将保存对会话中对象所做的任何更改,并且更改仍然存在。
您可以设置会话中的FlushMode属性。如果您想要只读事务,请指定FlushMode.Manual。
希望这有帮助!