Nhibernate& amp;单元模式

时间:2014-07-06 05:37:16

标签: c# asp.net-mvc nhibernate fluent-nhibernate

我有一个像这样的复杂对象

 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.

级联正在照顾孩子的插入 - 也是孩子的插入。

在这里我非常感到痛苦,我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

我猜你的映射正在急切地抓住所有那些我不会做的孩子。没有看你的映射就很难说,但如果你在映射中看到类似的东西,这就是你的问题:

HasMany(x => x.OrderLines)
            .FetchType.Select();

HasMany(x => x.OrderLines)
            .FetchType.Join();

这意味着当您加载父对象时,所有这些集合也将被加载,这可能导致臭名昭着的“选择n + 1”问题。

以下是来自nhibernate文档:

  

(3)fetch(可选,默认为join):启用外连接或   顺序选择此关联的提取。这是一个特殊的   案件;对于实体的完全渴望获取(在单个SELECT中)和   你可以启用它与其他实体的多对多关系   不仅要加入集合本身,还要使用它   嵌套元素的属性。

如果您无法更改映射,我建议您事先创建查询以获取所有子集合。这样你每个实体只进行1次查询,而不是1000的nhibernate目前通过延迟加载进行查询。