2011-05-05 54 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對我來說。

如果不需要集合,則無法將其包含在查詢中並依賴延遲加載。