首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NHibernate延迟加载绑定到会话?

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

Stack Overflow用户
提问于 2009-09-30 20:57:03
回答 2查看 1.4K关注 0票数 4

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

下面的工作(很明显)

代码语言:javascript
复制
using (new SessionScope())
{
    User singleUser = User.FindFirst(...)
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

因为我需要修改某个上下文中的会话过滤器(使用拦截器),所以我创建了一个新的SessionScope。

代码语言:javascript
复制
using (new SessionScope())
{
    User singleUser;
    EnableVariousFiltersInThisThread();
    using (new SessionScope())
    {
        singleUser = User.FindFirst(...);
    }
    DisableVariousFiltersInThisThread();
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

最后一行"singleUser.Groups“抛出了一个LazyInitializationException:”未能懒惰地初始化role: Groups的集合,没有会话或会话被关闭“。

但是,所有其他会话操作都可以正常工作。因此,看起来"singleUser“绑定到了现在处理的SessionScope。为什么?这个问题又该如何解决呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-01 15:46:23

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

票数 0
EN

Stack Overflow用户

发布于 2009-10-01 07:01:57

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

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

内部作用域与外部作用域没有什么不同;它也不支持此作用域外部的延迟加载。

但是,如果您诱使NHibernate在您的内部作用域中立即加载,则可以绕过此限制。或者,在退出作用域之前,对您想要使用的集合调用.ToList()或类似的方法,数据也可以在外部使用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1500621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档