2013-06-25 33 views
1

我想關閉 lazyloading 一對多映射在NHibernate中。我在我的實體映射類中有以下映射。一個實體有許多地址,我所尋找的是一個基本上將基表連接到Addresses表的查詢,並將所有結果返回給一個請求。相反,我看到一系列sql查詢提交給數據庫中的每個記錄在基表中。NHibernate一對多LazyLoad關閉導致n + 1查詢

HasMany(m => m.Addresses).Not.LazyLoad().Fetch.Join(); 

我需要一種方法來完全關閉lazyloading。

回答

2

我認爲這將是anough:

HasMany(m => m.Addresses).Not.LazyLoad();

獲取數據與選擇,你應該明確地使用 「魂」:

session.QueryOver<Item>() 
    .Fetch(item => item.Addresses).Eager 
    .Take(1000) 
    .TransformUsing(Transformers.DistinctRootEntity) 
    .List(); 
3

我強烈建議由Ayende閱讀這篇博客:NHibernate is lazy, just live with it

使用ORM並試圖避免懶惰......不起作用。例如,在地址的情況下,您將失去分頁。

(擷取他們通過加盟,會發生什麼?如果將與10個 地址實體,你會問前10個記錄......你會得到的只是一個 ,而且它可能會更糟如果你問11 ...)

但是你可以使用的東西,是NHibernate的功率:19.1.5. Using batch fetching

HasMany(m => m.Address) 
... 
.Fetch.Select() 
.BatchSize(25) 

現在,如果你的東東d 25條記錄,將會有2個選擇。第一個爲實體,第二個爲所有相關地址。這是改進,而ORM的所有優點仍然存在。