我有一个像这样的复杂对象
A
|
|
| |->C(As child)---->it has 4 hastomany properties(each B has 10000 C child)
B(has many child)->
|->D(As child)---->it has 4 hastomany properties(each B has 1o000 D child)
|->B Has many prop also
|
|
|A has many prop also
我,我的表现很糟糕。在检索此记录时,我可以期待Nh发出1000-2000个查询。但NH 10-20K最糟糕的表现是它正在解雇。
这里我只在实体A上阅读和写作。我没有单独插入任何A的孩子,也没有追溯。我在实体A上获取命令并仅回写实体A.
级联正在照顾孩子的插入 - 也是孩子的插入。
在这里我非常感到痛苦,我不知道该怎么做。
答案 0 :(得分:1)
我猜你的映射正在急切地抓住所有那些我不会做的孩子。没有看你的映射就很难说,但如果你在映射中看到类似的东西,这就是你的问题:
HasMany(x => x.OrderLines)
.FetchType.Select();
或
HasMany(x => x.OrderLines)
.FetchType.Join();
这意味着当您加载父对象时,所有这些集合也将被加载,这可能导致臭名昭着的“选择n + 1”问题。
以下是来自nhibernate文档:
(3)fetch(可选,默认为join):启用外连接或 顺序选择此关联的提取。这是一个特殊的 案件;对于实体的完全渴望获取(在单个SELECT中)和 你可以启用它与其他实体的多对多关系 不仅要加入集合本身,还要使用它 嵌套元素的属性。
如果您无法更改映射,我建议您事先创建查询以获取所有子集合。这样你每个实体只进行1次查询,而不是1000的nhibernate目前通过延迟加载进行查询。