nHibernate:重置对象的原始状态

时间:2011-08-11 11:52:12

标签: wpf nhibernate session-state

我有一个非常基本的查询。我正在使用WPF Binding来编辑由ISession加载的对象。如果有人在表单中编辑此对象,由于双向绑定和有状态会话,每当我关闭会话时,对表单中所做对象的更改都会存储回数据库中。哪种方法可以避免这种情况?

我知道的方法:

  1. 影子复制对象并使用复制的对象作为DataContext(我现在使用的方法)。
  2. ISession.Clear
  3. 使用IStatelessSession
  4. 在关闭ISession之前,有没有办法将对象重置为原始格式?

3 个答案:

答案 0 :(得分:1)

如果你看这里:http://nhforge.org/wikis/howtonh/finding-dirty-properties-in-nhibernate.aspx

这是查找脏属性的示例。 NHibernate通过EntityEntry对象在内部跟踪持久对象的状态。

这对你很有用,因为只需对上面的方法进行一些修改,你就可以得到旧的值......你可以用它来重置属性。

至于关闭会话导致将对象刷新到数据库,可以将会话FlushMode设置为FlushMode.Never。这意味着在调用Session.Flush()之前不会发生数据库同步。

或者,您可以挂钩到IFlushEntityEventListener以重置对象状态。有一个在谷歌上使用NHibernate事件系统的合理例子。

答案 1 :(得分:1)

请参阅Managing the caches上的NHibernate Forge

  

随后调用Flush()时,该对象的状态将与数据库同步。如果您不希望发生此同步,或者您正在处理大量对象并需要有效管理内存,则可以使用Evict()方法从第一级缓存中删除对象及其集合。

我认为这听起来像你想要的。

答案 2 :(得分:0)

我建议使用交易。如果是这种情况,您只需回滚交易吗?你觉得怎么样?