2012-01-18 77 views
1

請幫助我,我是EF.Lazy新加載的POCO對象似乎沒有工作。延遲加載不適用於實體框架中的POCO類

  • 我POCO類在一個sepearte組件,一個比一個用於數據存取(即DAL)
  • 數據接取層簡單地換到EF的對象上下文進行的調用其他。請參考下面

    public FilterMaster GetFilter(long ID) 
    { 
        FilterMaster entity = new FilterMaster(); 
        try 
        { 
         using (var context = new RadarEntities()) 
         {     
          //context.ContextOptions.LazyLoadingEnabled = false; 
          //context.ContextOptions.ProxyCreationEnabled = true; 
          entity = context.FilterMasters.SingleOrDefault(filter => filter.ID == ID); 
          //context.FilterMasters.Include(
          context.LoadProperty(entity, "SQLQuery");     
    
         } 
        } 
    
    • 當完成DAL呼叫時,ObjectContext的丟失的代碼,當我試圖獲取根POCO類的相關子對象,我得到空。
    • 我已經嘗試明確啓用ProxyCreation,EnabledLazyLoading,檢查生成的代理clases不密封和所有相關的屬性被標記爲虛擬(如其他一些鏈接建議)。 - 由於延遲加載不起作用,我想急切地加載所有相關的POCO對象,因此嘗試調用LoadProperty方法,該方法起作用。

Q1:我是Imissing一些延遲加載不工作? Q2:如果我想要加載所有相關的子對象,必須爲所有屬性調用LoadProperty方法,或者有更簡單的方法嗎?

回答

3

您正在處置您的ObjectContext。這是阻止你使用LazyLoading的原因。如果您需要LazyLoading,則包含GetFilter的類應在創建時創建ObjectContext,實施IDisposable,並在處置它時處置ObjectContext

+0

但隨後POCO的目的將被打敗的gthen woould成爲持久性認識。目前只有DAL API具有對ObjectContext的引用。 – 2012-01-18 21:37:52

+0

@BrikeshKumar:但是你的上層有一個DAL API類的引用(或者也許只有一個接口)。您只需將'ObjectContext'作爲該類中的私有成員,並且不要在每種方法中創建和處理它。上層仍然沒有看到有關上下文的任何信息。如果由於某種原因你無法做到這一點,那麼你有一個懶惰加載不友好的架構,並且不能真正使用延遲加載。 – Slauma 2012-01-18 21:54:49

+0

謝謝Slauma !!我正在嘗試。我將Object上下文類從DAL項目中取出,並將它的實例注入DAL類的構造函數中......當前運行到上下文類的問題無法找到元數據.. – 2012-01-19 03:02:02

2

問題1:我是否打算延遲加載不起作用?

它正在工作,但沒有涉及的魔術 - 爲您創建一個代理下面,它將嘗試從第一次訪問時爲您檢索數據庫中的屬性值。

對於EF,數據庫連接由上下文表示,目前您在使用塊的末尾自動處理該上下文。沒有數據庫連接,EF不能懶惰地檢索屬性,因此延遲加載將不起作用。

您必須保持上下文一直存在,直到您訪問了所有需要訪問以進行延遲加載的屬性,或者急切地加載這些屬性。

Q2:如果我想明確地加載所有相關的子對象的 將不得不呼籲所有屬性LoadProperty方法或有 是任何簡單的方法?

是的,你可以指定一個Include()查詢急切地檢索屬性,你的情況,這將是:

entity = context.FilterMasters 
       .Include("SQLQuery") 
       .SingleOrDefault(filter => filter.ID == ID); 
+0

我認爲只有'Include'的字符串版本是因爲'context'是一個'ObjectContext'。 – Slauma 2012-01-18 21:39:39

+0

謝謝Slauma,我很習慣強類型的版本,將更新 – BrokenGlass 2012-01-18 21:41:20

+0

是的,我只看到一個版本的包含函數需要一個字符串。另外如果我做一個急切的加載,那麼我會爲整個對象圖中的每個屬性寫一行。 – 2012-01-18 21:43:43

相關問題