gpt4 book ai didi

nhibernate - 防止 Fluent NHibernate 选择 n+1

转载 作者:行者123 更新时间:2023-12-04 17:42:28 27 4
gpt4 key购买 nike

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

我知道的两个解决方案是

  • 热切的 child
  • 分解我的对象图(和急切的负载)

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

    目前....

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

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

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

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

    最佳答案

    在我看来,您希望采用使用域模型的方法,而不是创建特定的休眠查询来处理这种情况。鉴于此,我建议您查看可以应用于您的集合的批量大小属性。 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 查询。

    关于nhibernate - 防止 Fluent NHibernate 选择 n+1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/581199/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com