使用城堡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中:“未能初始化懒洋洋角色的集合:组,没有会议或会议是封闭的。”

不过,所有其他会话操作正常工作。如此看来,“单用户”绑定到现在安置SessionScope。为什么?以及如何可以在此可替换地解决?

有帮助吗?

解决方案

我的 GUESS 的是 - 部分原因是关于 “标识映射”。不仅延迟装入目标,也是所有对象绑定到会话。这可以确保没有两个对象在数据库代表一个单一行。

其他提示

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

您的实体都与会话相关联,并使用这个懒加载。如果你处理你的会话,你不能获取延迟加载的集合和属性。答案,显然考虑到这一限制,是为了避免处理会话 - 或保持会话的生命,直到您已经解你所需要的数据。

在范围内从外没有什么不同;它不支持迟缓装载此范围之外或者

但是,您可以解决此限制,如果你内心的范围内,诱骗NHibernate的进入预先加载。另外,请你想一起工作,在退出之前范围集合.ToList()或相似,数据也将可外面。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top