5

我有一个相当深的对象图(5-6 个节点),当我遍历它的一部分时,NHProf 告诉我我遇到了“选择 N+1”问题(我确实这样做了)。

我知道的两个解决方案是

  1. 急切的负载孩子
  2. 分解我的对象图(和急切的负载)

我真的不想做这些(尽管我可能会在以后将图表分开,因为我预见到它会增长)

目前....

是否可以告诉 NHibernate(使用 FluentNHibernate)每当我尝试访问孩子时,一次性加载它们,而不是在我迭代它们时选择-n+1-ing?

我也得到了“无限的结果集”,这可能是同一个问题(或者更确切地说,如果可能的话,将通过上述解决方案来解决)。

每个子集合(在整个图表中)将只有大约 20 个成员,但是 20^5 很多,所以我不想在获得根时急切加载所有内容,而只是在我获得所有子集合时靠近它。

编辑:事后诸葛亮......如果我想在渲染孩子时引入分页怎么办?我必须在这里打破我的对象图,还是我可以利用一些鬼鬼祟祟的方法来解决所有这些问题?

4

2 回答 2

10

在我看来,您希望采用使用域模型的方法,而不是创建特定的休眠查询来处理这种情况。鉴于此,我建议您查看可以应用于您的集合的批量大小属性。Fluent NHibernate fluent interface 尚不支持此属性,但作为一种解决方法,您可以使用:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20")

鉴于普遍缺乏有关您的确切场景的信息,我不能确定批量大小是否是理想的解决方案,但我当然建议您试一试。如果您还没有,我建议您阅读以下内容:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

NHibernate 性能文档将解释批量大小的工作原理。

编辑:我不知道有任何方法可以从您的域模型中分页。我建议您为需要分页的场景编写 NH 查询。

于 2009-02-24T11:40:16.393 回答
0

编辑:事后诸葛亮....如果我想在渲染孩子时引入分页怎么办?我必须在这里打破我的对象图吗,还是我可以利用一些鬼鬼祟祟的方法来解决所有这些问题?

好吧,如果您只加载孩子,那么您可以分页它们:)。但是,如果您想要类似的东西: LoadParent AND PageChildren ,那么我认为您不能这样做。

于 2009-02-28T08:08:42.890 回答