【问题标题】:Getting changed entities from NHibernate session从 NHibernate 会话中获取更改的实体
【发布时间】:2010-01-13 10:17:50
【问题描述】:

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

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

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

提前非常感谢

塞比

【问题讨论】:

    标签: .net nhibernate session


    【解决方案1】:

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

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

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

    【讨论】:

    • 帮我弄清楚这一点...我的会话生命周期范围从从数据库读取对象到修改一些对象再到将这些更改发回。然后,一个新的会话开始。你会怎么建议我这样做?您是否有机会获得最佳实践示例?非常感谢
    • 我已经稍微编辑了答案。你能告诉我的越多,我就能告诉你的越多……:)
    • 我和你在一起。使用单独的会话听起来是件好事。我会调查一下。无论如何,对于我最初的问题,这意味着我仍然必须采用手动的变更跟踪方法,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多