1

我正在尝试关闭NHibernate中一对多映射的延迟加载。我的实体映射类中有以下映射。一个实体有很多地址,而我正在寻找的是一个查询,它基本上将基表连接到地址表并在一个请求中返回所有结果。相反,我看到为基表中的每条记录提交到数据库的一系列 sql 查询。

HasMany(m => m.Addresses).Not.LazyLoad().Fetch.Join();

我需要一种方法来完全关闭延迟加载。

4

3 回答 3

3

我强烈建议阅读 Ayende 的这篇博文:NHibernate 是懒惰的,只是忍受它

使用 ORM 并试图避免懒惰……是行不通的。例如,在地址的情况下,您将丢失分页。

(在通过连接获取它们时,会发生什么?如果将有具有 10 个地址的实体,并且您将要求前 10 条记录……您只会得到一条。如果您要求 11 条,情况可能会更糟…… )

但是您可以使用的是 NHibernate 的强大功能:19.1.5。使用批量获取

HasMany(m => m.Address)
 ...
.Fetch.Select()
.BatchSize(25)

现在,如果您需要 25 条记录,则将有 2 个 SELECT。首先是实体,其次是所有相关地址。这是一种改进,而 ORM 的所有优势仍然存在。

于 2013-06-25T17:40:31.530 回答
2

我认为这就足够了:

HasMany(m => m.Addresses).Not.LazyLoad();

要使用 select 获取数据,您应该明确使用“Fetch”:

session.QueryOver<Item>()
   .Fetch(item => item.Addresses).Eager
   .Take(1000)
   .TransformUsing(Transformers.DistinctRootEntity)
   .List();
于 2013-06-26T06:51:49.740 回答
1

我假设您使用 HQL、Linq 或普通 SQL 查询加载基本实体。这些查询忽略映射中的“加入”获取设置。您必须在查询中显式获取地址或使用 Get/Criteria/QueryOver。

参考文档: http: //nhibernate.info/doc/nh/en/index.html#performance-fetching-custom

于 2013-06-25T08:41:52.337 回答