我有一个相当深的对象图(5-6个节点),当我遍历它的部分时,NHProf告诉我我有一个"选择N + 1"问题(我这样做).
我所知道的两个解决方案是
渴望加载孩子
分解我的对象图(和急切的负载)
我真的不想做这些中的任何一个(虽然我可能会稍后将图表分开,因为我预测它会增长)
目前....
是否有可能告诉NHibernate(使用FluentNHibernate)每当我尝试访问子进程时,一次性加载它们,而不是select-n + 1-ing,因为我迭代它们?
我也得到了"无限结果集",这可能是同样的问题(或者更确切地说,如果可能的话,将由上述解决方案解决).
每个子集合(整个图表)将只有大约20个成员,但20 ^ 5很多,所以当我得到root时我不想急于加载所有内容,而只是每当我获取所有子集合时靠近它.
编辑:事后的想法....如果我想在渲染孩子时引入分页怎么办?我是否必须在这里打破我的对象图,或者我可以用一些偷偷摸摸来解决所有这些问题?
听起来我想要继续使用域模型而不是创建特定的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查询.