流畅的NHibernate一对多映射导致错误查询

时间:2014-01-29 22:54:04

标签: nhibernate fluent-nhibernate

我使用Fluent NHibernate进行了很简单的一对多映射,除了NH生成的查询不太理想之外,它工作正常。当我从NH检查sql日志时,我发现了这一点。

我正在寻找的查询就像

select p.*, c.* from parent p inner join child c on p.Id = c.parentId

其中p.ID是父表的PK,c.ParentId是子表中指向父表PK的FK。

但我从sql日志中发现的是这样的:

select P.* from Parent

后跟一堆针对子表运行的查询,如

select * from child c where c.ParentId = @p0

毫不奇怪,这会导致性能问题。

我的问题是为什么NH不会生成内部联接查询我认为它应该?我需要更改什么才能让NH生成所需的查询?

1 个答案:

答案 0 :(得分:1)

JOIN不适用于此方案。它将生成SELECT,从而产生更多行,然后Parent表具有。即:父项的每个子项将追加新行。

这里适当的解决方案是将这些选择分开。首先选择父项,然后为所有父项(仅选择父项)加载所有子项。 NHibernate确实有很好的解决方案:

这与你经历的有点相似。首先选择父母,然后选择孩子(ren)。最大的区别在于,我们现在分批为更多的孩子而不是1 + N(分别针对每个儿童收藏)。所以它可能是1 + 2

批量大小映射的示例

1)Colleciton

HasMany<Child>(x => x.Children)
  .BatchSize(25);

2)实体本身

public ChildMap()
{
    Id(x => x....
    ...
    BatchSize(25);

还有许多其他优势,其中PAGING是最赚钱的之一。因为我们正在使用公寓(而不是相乘)家长,我们可以应用.Take().Skip()

最后,我们希望找到一些基于孩子的父母,我们可以在这种情况下使用子查询:15.8. Detached queries and subqueries