【发布时间】:2012-01-27 17:39:07
【问题描述】:
我需要(出于一个真正充分的理由,相信我)使用 NHibernate 加载我的数据库的几乎整个图表。实体不多,但图表有点复杂。
我的图表看起来像:
- 实体A
- |
- --> 实体B
- |
- --> 列表
- |
- -->实体D
- |
- --> 列表
- |
- --> 实体F
嗯...你明白了。
我想用尽可能少的查询和往返来加载所有这些,并且可能根本没有选择 N+1。我也想把它保存为图表,这样我以后可以轻松地循环浏览它。
我最好的选择是什么? NHibernateUtil.Initialize()? Fetch()/FetchMany()?未来/多查询?
我有点迷路了,但我想我必须在多个操作中完成它。但是什么是最有效的呢?
还有好处:所有实体都有一个 IsPublished 属性。我希望能够加载所有实体或仅加载已发布的实体。
编辑
最后我尝试了这个:
var applicationFields = NHibernateSession.Current.Query<ApplicationField>().Where(af => af.Ispublished)
.FetchMany(af => af.Illustrations)
.ThenFetch(i => i.InteractiveConfiguration)
.ThenFetchMany(ic => ic.UniqueSellingPoints)
.ThenFetchMany(usp => usp.Pictures)
.ToList();
考虑到我的图表的外观,我认为还可以。此外,我在同一级别上没有多个集合,据我所知,这就是导致笛卡尔积的原因。
对于那些询问的人,这不是递归问题。否则我将使用 SQL Server CTE。我也没有更新任何实体;它只是简单的阅读(对于离线应用程序)。
但我对我的“奖金”问题一无所知。我知道 EF 可以基于过滤器加载部分集合,但 NH 似乎不可能。
【问题讨论】:
-
您能否发布您当前的映射和类,我假设所有实体都来自同一类型。
-
您是否要更新您加载的许多实体?您是否正在加载所有这些数据以提取摘要类型信息?视图或休眠查询可能对此有所帮助。在我看来,这真的取决于你如何使用这些数据。
标签: sql-server nhibernate graph future multi-query