batch-size
在Category.ChildCategories
映射上指定 a 。这将导致 NHibernate 分批获取指定大小的子节点,而不是一次一个(这将缓解 N+1 问题)。
如果您使用的是.hbm
文件,则可以batch-size
这样指定:
<bag name="ChildCategories" batch-size="30">
或使用流利的映射
HasMany(x => x.ChildCategories).KeyColumn("ParentId").BatchSize(30);
有关详细信息,请参阅NHibernate 文档。
编辑
好的,我相信我理解您的要求。使用以下配置
HasManyToMany<Item>(x => x.ChildCategories)
.Table("CategoryLink")
.ParentKeyColumn("ParentId")
.ChildKeyColumn("CategoryID")
.BatchSize(100)
.Not.LazyLoad()
.Fetch.Join();
您应该能够使用以下行在一次调用中获取整个层次结构。
var result = session.CreateCriteria(typeof(Category)).List();
出于某种原因,检索这样的单个类别
var categoryId = 1;
var result = session.Get<Category>(categoryId);
导致层次结构中的每一级调用一次。我相信这仍会显着减少对数据库的调用次数,但我无法让上面的示例与对数据库的单个调用一起工作。