2011-05-20 55 views
7

我有一個非常複雜的對象圖,我想一次加載 一舉。NHibernate Eager在一個複雜的對象圖上加載Queryover API

樣品具有Daylogs具有具有Daylog 結果

Daylog測試Daylog測試具有Testkeys,Daylog結果有Resultkeys,和 TestKeys具有Resultkeys。

我正在使用QueryOver API和Future來將這些全部作爲一個查詢運行,並且所有NHibernate應該實例化所有數據,以便實例化由NHProf返回的完整的 圖形。

   public static IList<Daylog> DatablockLoad(Isession sess, 
ICollection<int> ids) 
       { 
         var daylogQuery = sess.QueryOver<Daylog>() 
           .WhereRestrictionOn(dl => dl.DaylogID).IsIn(ids.ToArray()) 
           .Fetch(dl => dl.Tests).Eager 
           .TransformUsing(Transformers.DistinctRootEntity) 
           .Future<Daylog>(); 

         sess.QueryOver<DaylogTest>() 
           .WhereRestrictionOn(dlt => 
dlt.Daylog.DaylogID).IsIn(ids.ToArray()) 
           .Fetch(dlt => dlt.Results).Eager 
           .Inner.JoinQueryOver<TestKey>(dlt => dlt.TestKey) 
           .Fetch(dlt => dlt.TestKey).Eager 
           .Inner.JoinQueryOver<ResultKey>(tk => tk.Results) 
           .Fetch(dlt => dlt.TestKey.Results).Eager 
           .Future<DaylogTest>(); 

         sess.QueryOver<DaylogResult>() 
           .Inner.JoinQueryOver(dlr => dlr.DaylogTest) 
           .WhereRestrictionOn(dlt => 
dlt.Daylog.DaylogID).IsIn(ids.ToArray()) 
           .Fetch(dlr => dlr.ResultKey).Eager 
           .Fetch(dlr => dlr.History).Eager 
           .Future<DaylogResult>(); 

         var daylogs = daylogQuery.ToList(); 

         return daylogs; 
       } 

不過,我還是最終與代理代表密押和ResultKey之間的關係 ,即使我特別加載 這種關係。

我覺得這整個查詢可能是代表一個貧窮 理解QueryOver API的,所以我想任何和所有的意見 就可以了,但主要是,我想知道爲什麼我得到一個代理,而不是 後面的結果列表我試圖獲得 daylogresult.resultkey.testkey.results。

任何幫助?

回答

5

答案是在各種對象上調用NHibernateUtil.Initialize。簡單地將數據拉下來並不意味着NHibernate會保護所有的代理。

0

你必須加載一個QueryOver子句中的所有實體以擺脫代理。但在這種情況下,您的查詢中會有很多連接,因此我建議使用延遲加載和批處理。