2012-07-20 44 views
8

我使用實體框架的創建數據庫模式,並生成我的代碼。我有一個名爲Employee的表,它有DaysOff表中的子記錄。 DaysOff具有員工的外鍵,並且在我的模型中有1 to *關聯。我在Employee表上運行了一個LINQ查詢,並期望我的Domain.Employee對象將被DaysOff填充,但DaysOff爲空。當我在對象中鑽取時,我看到「employee.DaysOff.Count拋出了System.ObjectDisposedException類型的異常」。我認爲孩子記錄將被填充是錯誤的嗎?我將如何做到這一點?下面是我打電話讓我的員工的方法:LINQ子記錄空

public static Domain.Employee SelectEmployee(int employeeId) 
{ 
    using (var db = new EmployeeEntities()) 
    { 

     Domain.Employee emp = (from e in db.Employees 
         where e.EmployeeId == employeeId 
         select e 
          ).FirstOrDefault(); 

     return emp; 
    } 
} 

編輯: 下面的接受的答案和註釋的組合(所有上投票)幫我解決這個(耶!):

public static Domain.Employee SelectEmployee(int employeeId) 
{ 
    using (var db = new EmployeeEntities()) 
    { 

     Domain.Employee emp = (from e in db.Employees.Include("DaysOff") 
         where e.EmployeeId == employeeId 
         select e).FirstOrDefault(); 

     return emp; 
    } 
} 
+0

是。這是LINQ稱爲延遲加載/延期執行的基本原則。您可能會發現閱讀某些(大量)文檔很有幫助,例如:http://www.rizalalmashoor.com/blog/linq-to-entities-deferred-execution-and-lazy-loading/ – mellamokb 2012-07-20 15:38:03

+0

見:http://msdn.microsoft.com/en-us/library/bb896272 – CodingGorilla 2012-07-20 15:39:57

回答

10

我錯以爲孩子的記錄將被填充?

猜測,這可能是因爲DaysOff是懶洋洋地填充,而是由點EmployeeEntities已被釋放。你可能會想嘗試類似:

using (var db = new EmployeeEntities().Include("Employee.DaysOff")) 

另外請注意,您在using語句代碼會更簡單寫爲:

return db.Employees.FirstOrDefault(e => e.EmployeeId == employeeId); 

編輯上述

代碼是不正確的。 Include必須在一個或ObjectQuery<T>IQueryable<T>使用,並且不能被應用到ObjectContext/DbContext。正確的用法是:

using (var db = new EmployeeEntities()) 
{ 
    return db.Employees.Include("DaysOff") 
     .FirstOrDefault(e => e.EmployeeId == employeeId); 
} 
+0

@CodingGorilla:我有點糊塗了。他確實得到了'ObjectDisposedException',這意味着延遲加載被啓用?或者我錯過了什麼? – Chris 2012-07-20 15:49:14

+1

Jon,你已經在EF版本19 :)(爲整個上下文實例啓用「auto-eager-loading」...)。目前,您不能應用'Include'到上下文,但你必須把'Include'個人查詢裏面:'返回db.Employees.Include(「DaysOff」)FirstOrDefault ...'等 – Slauma 2012-07-20 15:57:14

+0

克里斯。 '他'='她'。;) Slauma,感謝您的評論。我投了票,因爲你幫我解決了我的問題。 – l15a 2012-07-20 16:43:43

4

這裏約爲子實體的加載後會談

Using DbContext in EF 4.1 Part 6: Loading Related Entities

急切地加載相關實體

// Load all prents and related childs 
    var princesses1 = context.Parent 
          .Include(p => p.childs) 
          .ToList(); 

明確裝入相關實體

var parent = context.parent.Find(1); 
    context.Entry(parent) 
     .Collection(p => p.childs) 
     .Load();