【问题标题】:NHibernate : load entire graph (collection of collection of collection)NHibernate:加载整个图(集合的集合)
【发布时间】: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


【解决方案1】:

简短回答:Fetch()/FetchMany() 和 Future() 的组合,具体取决于用例和预期的列表大小

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多