当前位置:  开发笔记 > 前端 > 正文

防止Fluent NHibernate选择n + 1

如何解决《防止FluentNHibernate选择n+1》经验,为你挑选了1个好方法。

我有一个相当深的对象图(5-6个节点),当我遍历它的部分时,NHProf告诉我我有一个"选择N + 1"问题(我这样做).

我所知道的两个解决方案是

    渴望加载孩子

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

我真的不想做这些中的任何一个(虽然我可能会稍后将图表分开,因为我预测它会增长)

目前....

是否有可能告诉NHibernate(使用FluentNHibernate)每当我尝试访问子进程时,一次性加载它们,而不是select-n + 1-ing,因为我迭代它们?

我也得到了"无限结果集",这可能是同样的问题(或者更确切地说,如果可能的话,将由上述解决方案解决).

每个子集合(整个图表)将只有大约20个成员,但20 ^ 5很多,所以当我得到root时我不想急于加载所有内容,而只是每当我获取所有子集合时靠近它.

编辑:事后的想法....如果我想在渲染孩子时引入分页怎么办?我是否必须在这里打破我的对象图,或者我可以用一些偷偷摸摸来解决所有这些问题?



1> Paul Batum..:

听起来我想要继续使用域模型而不是创建特定的nhibernate查询来处理这种情况.鉴于此,我建议您查看可以应用于集合的batch-size属性.Fluent NHibernate流畅的界面尚不支持此属性,但作为解决方法,您可以使用:

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查询.


注意 - > fluent-nh接口现在支持BatchSize()属性
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有