2011-05-05 104 views
1

我有两个与NHibernate映射的类:class应用程序引用class Store与一个属性StoreId。应用程序用户有一个身份证,而类商店有一个分配的ID,但我不认为在这种情况下的问题。双向多对一生成SELECT N + 1

ApplicationUser映射:

<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决定为每个不引用ApplicationUser的商店额外增加SELECT ... FROM ApplicationUser WHERE StoreId = ?

这是巨大的矫枉过正,完全没有必要,因为它应该已经知道这些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

我想你可能想使用一对一的映射来避免这个问题http://nhforge.org/doc/nh/en/index.html#mapping-declaration-onetoone – Vadim 2011-05-05 18:33:01

+0

是的,我实际上它是一对一的,但也存在问题,但现在我明白这可能是因为我没有配置获取属性... – Koen 2011-05-06 09:01:40

回答

0

我觉得这里发生了什么是NHibernate的尝试加载两个集合,你已经得到了各指定为“多对一'...我不认为有什么你可以做短缺的修改映射...

所以a - > xb和b - > xa,我的理解是,nHibernate会查询两个关系......使se对我来说。

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