nhibernate - 为什么 NHibernate 延迟加载绑定(bind)到 session ?

标签 nhibernate castle-activerecord filter session-scope

使用 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/

相关文章:

nhibernate:如何映射引用实体的组件?

c# - NHibernate:多对多映射异常

c# - 使用 NHibernate/CaSTLe ActiveRecord 将枚举映射到数据库

lazy-loading - 帮助处理 ActiveRecord 异常 "Failed to lazily initialize a collection - no session"

javascript - d3js selectAll 元素的 CSS 样式?

c# - NHibernate MySQL 映射设置列类型

c# - 无法删除集合 : [NHibernate. Exceptions.GenericADOException]

c# - 错误: How to save a many-to-many relationship in CaSTLe Active Record?

performance - 使我的 List.filter 在 Scala 上更快?

Java Streams - 过滤先前过滤的值