为什么NHibernate延迟加载绑定到会话?

为什么NHibernate延迟加载绑定到会话?,nhibernate,castle-activerecord,filter,session-scope,Nhibernate,Castle Activerecord,Filter,Session Scope,使用CastleActiveRecord,我在延迟加载时遇到了一个问题 以下工作(显然) 因为我需要在特定的上下文中修改会话过滤器(使用拦截器),所以我创建了一个新的SessionScope using (new SessionScope()) { User singleUser; EnableVariousFiltersInThisThread(); using (new SessionScope()) { singleUser = User.F

使用CastleActiveRecord,我在延迟加载时遇到了一个问题

以下工作(显然)

因为我需要在特定的上下文中修改会话过滤器(使用拦截器),所以我创建了一个新的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的工作方式

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

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


但是,如果您诱使NHibernate在您的内部范围内急切地加载,您可以绕过这个限制。或者,在退出作用域之前,对要使用的集合调用
.ToList()
或类似命令,数据也将在外部可用。

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

显然,NHibernate就是这样工作的。问题是为什么:-)谢谢你的建议。
using (new SessionScope())
{
    User singleUser;
    EnableVariousFiltersInThisThread();
    using (new SessionScope())
    {
        singleUser = User.FindFirst(...);
    }
    DisableVariousFiltersInThisThread();
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}