从NHibernate会话中获取更改的实体

时间:2010-01-13 10:17:51

标签: .net nhibernate session

我想知道是否有一种使用NHibernate跟踪已更改实体的流畅方法。

Session.IsDirty()是了解有变化的好方法,但不知道哪些变化。到目前为止,我已将更改记录在List中,以便稍后指定它们。最后我会遍历该列表并在每个列表上调用Session.Save()并从列表中删除该项。

有什么方法可以解决这个问题吗?

提前多多感谢

塞比

1 个答案:

答案 0 :(得分:0)

听起来您正试图解决会话生命周期错误的问题。会话旨在用于单个工作单元。不是以这种方式清除会话以继续使用它,而是应该刷新它并重新开始使用它。如果您使用它来缓存由于缓存而导致的应用程序,我建议您查看NHibernate中的二级缓存,它在SessionFactory而不是Session级别运行。

如果你有一个长时间运行的编辑过程,最后有一个大批量保存,那么在我的视图中你应该处理断开连接的对象。因此,您使用一个会话加载对象及其任何相关对象,在会话上下文之外使用它们进行编辑,然后在流程结束时,使用SaveOrUpdate将这些对象重新附加到新会话,然后刷新那个会话。如果您使用离线otimistic锁定并发方法,使用例如SQL Server timestamp列或Oracle ORA_SCN虚拟列作为您的版本,这种方法最有效。如果您下方的对象发生了更改,则更新将失败并显示StaleObjectStateException

但YMMV,我需要更多地了解你的应用程序,以便说出比这更具体的内容。