【问题标题】:Why is NHibernate lazy loading bound to the session?为什么 NHibernate 延迟加载绑定到会话?
【发布时间】:2009-09-30 20:57:02
【问题描述】:

使用 Castle ActiveRecord,我在延迟加载时遇到了问题。

以下作品(显然)

using (new SessionScope())
{
    User singleUser = User.FindFirst(...)
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

由于我需要在特定上下文中修改会话过滤器(使用拦截器),因此我创建了一个新的 SessionScope。

using (new SessionScope())
{
    User singleUser;
    EnableVariousFiltersInThisThread();
    using (new SessionScope())
    {
        singleUser = User.FindFirst(...);
    }
    DisableVariousFiltersInThisThread();
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

最后一行“singleUser.Groups”抛出 LazyInitializationException:“未能延迟初始化角色集合:组,没有会话或会话已关闭”。

但是,所有其他会话操作都可以正常工作。因此,似乎“singleUser”绑定到了现在处理的 SessionScope。为什么?又该如何解决呢?

【问题讨论】:

    标签: nhibernate castle-activerecord filter session-scope


    【解决方案1】:

    我相信这就是 NHibernate 的工作方式。

    您的实体都与会话相关联,并将其用于延迟加载。如果您处理会话,则无法获取延迟加载的集合和属性。考虑到这个限制,答案很明显,就是避免释放会话 - 或者在提取所需数据之前保持会话处于活动状态。

    内部范围与外部没有区别;它也不支持超出此范围的延迟加载。

    但是,如果您欺骗 NHibernate 在您的内部范围内进行预加载,您可以解决此限制。或者,在退出范围之前,在您想要使用的集合上调用 .ToList() 或类似名称,数据也将在外部可用。

    【讨论】:

    • 显然 NHibernate 就是这样工作的。问题是为什么:-) 感谢您的替代建议。
    【解决方案2】:

    我的 GUESS 是 - 部分原因是关于“身份图”。不仅延迟加载的对象,而且所有对象都绑定到会话。这可以确保没有两个对象代表数据库中的一行。

    【讨论】:

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