双向多对一生成SELECT N + 1

时间:2011-05-05 14:27:57

标签: c# sql-server-2005 nhibernate many-to-one bidirectional

我有两个用NHibernate映射的类:class Application引用具有StoreId属性的类Store。应用程序用户具有身份ID,而类Store具有指定的ID,但在这种情况下我不认为这很重要。

ApplicationUser mapping:

<many-to-one name="Store" column="StoreId" class="Store" />

商店映射:

<many-to-one name="ApplicationUser" column="Id" class="ApplicationUser" 
    property-ref="Store" insert="false" update="false" 
    fetch="join" outer-join="true" />

当我加载所有商店时,会按预期为ApplicationUser生成左外连接,但是在构建对象图时,NHibernate决定为每个没有存储的商店执行额外的SELECT ... FROM ApplicationUser WHERE StoreId = ?引用ApplicationUser。

这是一个巨大的矫枉过正,完全没必要,因为它应该已经知道那些ApplicationUser不存在。

任何人都知道如何阻止NHibernate生成这些额外的查询?

修改

课程非常基础,如下所示:

public class Store
{
    public virtual int Id { get; set; }
    // ...
    public virtual ApplicationUser ApplicationUser { get; set; }
}

public class ApplicationUser
{
    public virtual int Id { get; set; }
    // ...
    public virtual Store Store { get; set; }
}

1 个答案:

答案 0 :(得分:0)

我认为这里发生的事情是nHibernate试图加载这两个集合,因为你已经将每个集合指定为“多对一”...我认为除了修改映射之外没有什么可以做的。 。

所以a - &gt; xb和b - &gt; xa,我的理解是nHibernate会查询两个关系......对我来说很有意义。

如果不需要集合,则无法将其包含在查询中并依赖延迟加载。