当我从不执行session.Save时,为什么NHibernate会保存对象?

时间:2011-03-18 04:38:34

标签: nhibernate fluent-nhibernate

我正在使用NHibernate和Fluent NHibernate。

我有代码,我开始一个事务,然后我进入一个创建几个对象的循环。对于每个对象,我检查某些条件。如果满足这些条件,则在对象上执行session.SaveOrUpdate()。在循环结束时,我发出一个提交事务。

我在session.SaveOrUpdate命令上设置了一个断点,证明它已经 从不 (因为条件未被任何对象所满足)环)。 然而,当提交事务时,对象将被保存!

我正在使用AuditInterceptor并在OnSave方法中设置了断点。它被调用,但堆栈跟踪只追溯到提交事务的语句。

此时没有任何类型的对象已经对它们执行了SaveOrUpdate,因此级联不能解释它。

为什么NHibernate会保存这些对象?

2 个答案:

答案 0 :(得分:12)

来自NHibernate ISession.Update主题:

这是normaldefault behavior

  

Hibernate维护对象的缓存   已插入,更新或   删除。它还维护着缓存   已查询的对象   数据库。这些对象是   称为持久对象   只要是EntityManager就可以了   用于获取它们仍然是活跃的。   这意味着任何改变   这些对象在一个范围内   交易是自动的   交易时持续存在   承诺。这些更新是隐含的   在交易的边界内   而且你不必明确地打电话   任何持久化值的方法。

来自Hibernate Pitfalls part 2

  

问)我还需要做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。

希望这有帮助!