使用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:”未能懒惰地初始化role: Groups的集合,没有会话或会话被关闭“。
但是,所有其他会话操作都可以正常工作。因此,看起来"singleUser“绑定到了现在处理的SessionScope。为什么?这个问题又该如何解决呢?
发布于 2009-10-01 15:46:23
我的猜测是-部分原因是关于“身份地图”的。不仅延迟加载的对象,而且所有对象都绑定到一个会话。这确保了不会有两个对象代表数据库中的一行。
发布于 2009-10-01 07:01:57
我相信这就是NHibernate的工作方式。
您的实体都与一个会话相关联,并将其用于延迟加载。如果释放了会话,就不能获取延迟加载的集合和属性。考虑到这一限制,答案显而易见,就是避免处理会话-或者在提取所需数据之前保持会话活动。
内部作用域与外部作用域没有什么不同;它也不支持此作用域外部的延迟加载。
但是,如果您诱使NHibernate在您的内部作用域中立即加载,则可以绕过此限制。或者,在退出作用域之前,对您想要使用的集合调用.ToList()或类似的方法,数据也可以在外部使用。
https://stackoverflow.com/questions/1500621
复制相似问题