2010-11-16 103 views
6

我找不到這個問題的答案,所以我認爲這是我做錯了。Fluent NHibernate LazyLoad問題

我有一個PersistenceModel設置,我設置了一個約定如下: -

persistenceModel.Conventions.Add(DefaultLazy.Always()); 

然而,在我的實體之一HasManyToMany關係之一,我想預先加載發生對此我設置如下: -

HasManyToMany(x => x.Affiliates).Not.LazyLoad(); 

直覺上,我希望預先加載爲我重寫,我已經被指定爲公約的延遲加載默認,但它仍然延遲加載發生。如果我將DefaultLazy約定設置爲never,然後將LazyLoad設置爲單個關係,則它也不起作用。

任何想法?

回答

9

當你設置Not.LazyLoad()時,你告訴NHibernate在父裝載時加載聯盟。 NHibernate將通過在Affliates多對多表上執行另一個選擇來完成此操作,無論您是否訪問Affiliates集合。 NHibernate使用另一個選擇,因爲這是默認的提取模式。您也希望覆蓋提取模式,無論是在查詢中還是在映射中。要做到這一點的映射,添加以下內容:

HasManyToMany(x => x.Affiliates) 
    .Not.LazyLoad() 
    .Fetch.Join(); 

您可能還需要包括一個「.Cascade.AllDeleteOrphan()」如果你想NHibernate的堅持新Affiliaites添加到集合和刪除孤立的。如果你不這樣做,你將不得不明確地調用session.Save(newAffiliate)。否則,當您的聯盟集合包含新的聯盟會員時,您會收到TransientObjectException。

+0

對不起,我刪除了我認爲不相關的代碼部分。我確實有.FetchType.Join()也關閉延遲加載仍然不起作用。關閉延遲加載的唯一方法我發現,對我而言是通過設置約定。 – Dotnet 2010-11-17 08:33:17

+0

當應用Fetch.Join()時,我添加了DefaultLazy.Always()約定,並且HasManyToMany()關係正確加載正確。你可以在這裏從GitHub獲取我的示例:https://github.com/JamesKovacs/JamesKovacs.StackOverflow/tree/master/FluentNhHacking/ – 2010-11-17 17:04:18

+0

好吧,我很模仿你的代碼在我的情況下,它仍然沒有工作,所以我必須仔細觀察。我正在使用.ShowSql()來確定查詢是否延遲或急切地運行,我認爲這是準確的? – Dotnet 2010-11-18 09:04:45

0

這可能是一個愚蠢的問題,但你有沒有在你的會話中執行查詢?再說了,

Using(var session = OpenSession()) 
{ 
    session.Query<Entity>().ToList(); 
} 

我收到這個問題,終於意識到,我訪問處理會話之前沒有被質疑的對象。