更改 NHibernate 中的初始 LazyLoad 行为

Posted

技术标签:

【中文标题】更改 NHibernate 中的初始 LazyLoad 行为【英文标题】:Changing the initial LazyLoad behaviour in NHibernate 【发布时间】:2008-12-22 22:55:02 【问题描述】:

我刚刚开始使用 NHibernate 和 fluent-NHibernate,我认为这很棒。我一直在配置我的所有映射以将 LazyLoading 用于类之间的任何关系,因为通常我发现不需要预先加载所有内容。但是,有时您 100% 知道您将加载所有关系或至少一个关系,如果您预先获取数据,它将节省额外的连接。

您是否可以告诉 NHibernate 为关系加载关系数据并覆盖初始设置?

我之前使用过 LinqToSql,为此我会创建存储库,这些存储库会在必要时在哪些关系中加载哪些项目。这非常有效,所以我想要 NHibernate 类似的东西。

【问题讨论】:

【参考方案1】:

我发现这可以用于 NHibernate 查询的 LazyLoading / Eager loading 功能。

以正常方式创建您的 ICriteria,然后是关联名称(关系属性,对我来说是价格),然后是可以加入、选择、延迟加载、急切的获取类型

.SetFetchMode("Prices", FetchMode.Join)

【讨论】:

【参考方案2】:

如果您正在执行 HQL,您可以使用“left outer join fetch”或“left join fetch”来加入您想要获取的关联,而不是延迟加载,例如

如果您有一个 Building 类,该类的属性返回一个 Address 对象,并且此关系是延迟加载的,您可能具有类似于以下内容的 HQL:

string hql = "from Building bld where bld.Type.Id = 1";

当为每个建筑物访问地址属性时,将执行另一条 SQL 语句。将 HQL 更改为以下内容将获取地址作为原始 SQL 语句的一部分:

string hql = "from Building bld left outer join fetch bld.Address as addr where bld.Type.Id = 1";

【讨论】:

以上是关于更改 NHibernate 中的初始 LazyLoad 行为的主要内容,如果未能解决你的问题,请参考以下文章

EntityFramework 与 NHibernate 中的关系修复

Nhibernate“无法初始化集合”

NHibernate - 延迟初始化角色集合失败

NHibernate.LazyInitializationException: Initializing[] - 无法初始化代理 - 没有会话

如何使用 NHibernate 处理应用程序中的默认数据

在 NHibernate 中动态更改查询类型