2011-04-19 90 views
1

使用ORM時,我通常會創建一個工廠方法來返回DataContext/ObjectContext實例,然後使用它來查詢數據源。我通常讓我的工廠返回基本上下文類;所以在EF4的情況下,我返回一個ObjectContext類型實例,而不是生成的「MyDBConext」實例。該方法的簽名看起來是這樣的:EF4 Eager通過ObjectContext base實例加載

ObjectContext CreateContext() 

這種方法的createContext返回與LazyLoadingEnabled =虛假和ProxyCreationEnabled = FALSE選項的實例。當訪問實體集合時,我會調用類似ctx.CreateObjectSet()的方法,其中T當然是實體類型。

我注意到,當我使用ObjectContext類型實例而不是「MyDBConext」時,急切的加載似乎不起作用。

User result = null; 
using(ObjectContext ctx = ContextFactory.CreateContext()) { 
       ObjectSet<User> userSet = ctx.CreateObjectSet<User>(); 
       //userSet.Include(x => x.Roles); 
       userSet.Include("Roles"); 
       result = userSet.SingleOrDefault(exp);     
     } 
     return result; 

但改變using語句來像

using(MyDBConext ctx = new MyDBConext()) { 

按預期工作。但爲什麼?我可以不通過基礎ObjectContext實例加載嗎?

回答

0

以下是我解決我的問題

User result = null; 
using(ObjectContext ctx = ContextFactory.CreateContext()) { 
    ObjectSet<User> userSet = ctx.CreateObjectSet<User>();    
    result = userSet.Include("Roles").SingleOrDefault(exp);     
} 
return result; 

我認爲包含語句改變了對象集/的ObjectQuery的當前實例並返回它它。我認爲多數流暢的api是如何設計的。放置包含內聯和鏈接方法調用按預期產生查詢結果。這是關於EF

流利api的一個有趣的「事實」