4

使用 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。为什么?以及如何解决这个问题?

4

2 回答 2

4

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

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

内部范围与外部没有什么不同;它也不支持此范围之外的延迟加载。

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

于 2009-10-01T07:01:56.810 回答
0

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

于 2009-10-01T15:46:22.717 回答