【问题标题】:NHibernate Lazy Loading - After the session closesNHibernate 延迟加载 - 会话关闭后
【发布时间】:2010-12-23 05:22:51
【问题描述】:

是否可以在打开的会话期间延迟加载相关对象,但在会话关闭后仍然可以使用相关对象?

例如,我们有一个 USER 类和一个相关的 ROLE 类。当我们加载一个 USER 时,我们也会延迟加载相关的 ROLE 对象。我们能否让 USER 和 ROLE 类在会话关闭后完全加载并可用?

这个功能可行吗?

【问题讨论】:

    标签: c# nhibernate session lazy-loading


    【解决方案1】:

    简短的回答:不。您必须在会话关闭后、关闭会话之前初始化您需要的任何内容。用于强制加载惰性代理(不枚举)的方法是NHibernateUtil.Initialize(USER.ROLES)

    长答案...有点。可以将对象“重新附加”到新会话,从而允许初始化 PersistentBags 和其他 NH 代理。最好的使用方法是Session.Lock(USER, LockMode.None),因为您知道该对象存在于数据库中但不存在于您的新会话中,并且您尚未修改它。这会将对象与新会话关联起来,而不会告诉 NHibernate 对对象的读取或写入执行任何操作。

    但是,请注意这是代码异味。如果您经常将对象重新附加到新会话,这表明您没有保持会话打开足够长的时间。例如,每个窗口表单打开一个会话并在表单打开时保持打开状态没有问题,前提是您在窗口关闭时关闭它。

    【讨论】:

      【解决方案2】:

      如果您正在处理 1-1 关系(每个用户 0-1 个角色),那么可能最简单的选择是将其配置为急切获取而不是延迟加载。延迟加载确实适用于 1-* 亲属,或者特别大且很少需要的对象。 NH 在优化查询方面做得非常好,以便在这样的场景中快速包含急切的数据。

      【讨论】:

        【解决方案3】:

        是的。会话关闭后,任何延迟加载的对象都将保留在内存中,您可以毫无问题地访问它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-14
          • 1970-01-01
          • 2011-07-16
          • 1970-01-01
          相关资源
          最近更新 更多