.net 从NHibernate会话获取更改的实体

.net 从NHibernate会话获取更改的实体,.net,nhibernate,session,.net,Nhibernate,Session,我想知道是否有一种使用NHibernate跟踪已更改实体的平滑方法 Session.IsDirty是一种很好的方式,可以知道存在变化,但不是哪些变化。到目前为止,我已经将我的更改记录在一个列表中,以便以后能够指定它们。最后,我将循环该列表并调用会话。保存每个会话并从列表中删除该项 我有什么办法可以绕开这件事吗 提前多谢 Sebi听起来您正试图解决会话生命周期错误的问题。会话设计用于单个工作单元。与其用这种方式清除会话以继续使用它,您应该刷新它并用一个新会话重新开始。如果您使用它来加快应用程序的缓

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

Session.IsDirty是一种很好的方式,可以知道存在变化,但不是哪些变化。到目前为止,我已经将我的更改记录在一个列表中,以便以后能够指定它们。最后,我将循环该列表并调用会话。保存每个会话并从列表中删除该项

我有什么办法可以绕开这件事吗

提前多谢


Sebi

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

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


但是YMMV,我需要更多地了解您的应用程序,才能说得更具体一些。

听起来您正在努力解决会话生命周期错误的问题。会话设计用于单个工作单元。与其用这种方式清除会话以继续使用它,您应该刷新它并用一个新会话重新开始。如果您使用它来加快应用程序的缓存速度,我建议您查看NHibernate中的二级缓存,它在SessionFactory而不是会话级别运行

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


但是YMMV,我需要更多地了解您的应用程序,才能说得更具体。

帮我弄清楚这一点……我的会话生命周期从从从DB读取对象到修改某些对象,再到发回这些更改。然后,一个新的会话开始。你认为我怎么做?您是否有一个最佳实践示例?谢谢,我对答案做了一点修改。你能告诉我的越多,我能告诉你的越多…:我支持你。使用单独的会话听起来是一件好事。我会调查的。不管怎样,对于我最初的问题,这意味着我仍然必须采用手动的变更跟踪方法,对吗?请帮我弄清楚这一点……我的会话生命周期范围从从从DB读取对象到修改某些对象,再到发回这些变更。然后,一个新的会话开始。你认为我怎么做?您是否有一个最佳实践示例?谢谢,我对答案做了一点修改。你能告诉我的越多,我能告诉你的越多…:我支持你。使用单独的会话听起来是一件好事。我会调查的。不管怎样,对于我最初的问题,这意味着我仍然必须采用手动方法进行变更跟踪,对吗?