我正在尝试关闭NHibernate中一对多映射的延迟加载。我的实体映射类中有以下映射。一个实体有很多地址,而我正在寻找的是一个查询,它基本上将基表连接到地址表并在一个请求中返回所有结果。相反,我看到为基表中的每条记录提交到数据库的一系列 sql 查询。
HasMany(m => m.Addresses).Not.LazyLoad().Fetch.Join();
我需要一种方法来完全关闭延迟加载。
我正在尝试关闭NHibernate中一对多映射的延迟加载。我的实体映射类中有以下映射。一个实体有很多地址,而我正在寻找的是一个查询,它基本上将基表连接到地址表并在一个请求中返回所有结果。相反,我看到为基表中的每条记录提交到数据库的一系列 sql 查询。
HasMany(m => m.Addresses).Not.LazyLoad().Fetch.Join();
我需要一种方法来完全关闭延迟加载。
我强烈建议阅读 Ayende 的这篇博文:NHibernate 是懒惰的,只是忍受它。
使用 ORM 并试图避免懒惰……是行不通的。例如,在地址的情况下,您将丢失分页。
(在通过连接获取它们时,会发生什么?如果将有具有 10 个地址的实体,并且您将要求前 10 条记录……您只会得到一条。如果您要求 11 条,情况可能会更糟…… )
但是您可以使用的是 NHibernate 的强大功能:19.1.5。使用批量获取
HasMany(m => m.Address)
...
.Fetch.Select()
.BatchSize(25)
现在,如果您需要 25 条记录,则将有 2 个 SELECT。首先是实体,其次是所有相关地址。这是一种改进,而 ORM 的所有优势仍然存在。
我认为这就足够了:
HasMany(m => m.Addresses).Not.LazyLoad();
要使用 select 获取数据,您应该明确使用“Fetch”:
session.QueryOver<Item>()
.Fetch(item => item.Addresses).Eager
.Take(1000)
.TransformUsing(Transformers.DistinctRootEntity)
.List();
我假设您使用 HQL、Linq 或普通 SQL 查询加载基本实体。这些查询忽略映射中的“加入”获取设置。您必须在查询中显式获取地址或使用 Get/Criteria/QueryOver。
参考文档: http: //nhibernate.info/doc/nh/en/index.html#performance-fetching-custom