使用 CaSTLe ActiveRecord,我在延迟加载时偶然发现了一个问题。
以下作品(显然)
using (new SessionScope())
{
User singleUser = User.FindFirst(...)
UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}
由于我需要在特定上下文中修改 session 过滤器(使用拦截器),因此我创建了一个新的 SessionScope。
using (new SessionScope())
{
User singleUser;
EnableVariousFiltersInThisThread();
using (new SessionScope())
{
singleUser = User.FindFirst(...);
}
DisableVariousFiltersInThisThread();
UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}
最后一行“singleUser.Groups”抛出一个 LazyInitializationException:“未能延迟初始化角色集合:组,没有 session 或 session 已关闭”。
但是,所有其他 session 操作都可以正常工作。因此,似乎“singleUser”绑定(bind)到了现在处置的 SessionScope。为什么?以及如何解决这个问题?
最佳答案
我相信这就是 NHibernate 的工作方式。
您的实体都与 session 相关联,并将其用于延迟加载。如果您处理 session ,则无法获取延迟加载的集合和属性。考虑到这个限制,答案显然是避免释放 session - 或保持 session 事件,直到您提取了所需的数据。
内部范围与外部没有什么不同;它也不支持此范围之外的延迟加载。
但是,如果您欺骗 NHibernate 在您的内部范围内进行预加载,您可以解决此限制。或者,调用.ToList()
在退出范围之前,在您想要使用的集合上或类似的集合上,数据也将在外部可用。
关于nhibernate - 为什么 NHibernate 延迟加载绑定(bind)到 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1500621/