2012-07-20 35 views
8

Tôi đã sử dụng Khung thực thể để tạo lược đồ cơ sở dữ liệu và tạo mã của mình. Tôi có một bảng gọi là Nhân viên có hồ sơ trẻ em trong một bảng DaysOff. DaysOff có khóa ngoại giao cho Nhân viên và có liên kết 1 đến * trong mô hình của tôi. Tôi chạy một truy vấn LINQ trên bảng Employee và dự kiến ​​rằng đối tượng Domain.Employee của tôi sẽ được điền với DaysOff nhưng DaysOff là null. Khi tôi đi sâu vào Object tôi thấy "employee.DaysOff.Count đã ném một ngoại lệ kiểu System.ObjectDisposedException". Tôi có sai khi nghĩ rằng các hồ sơ trẻ em sẽ được phổ biến? Làm thế nào tôi sẽ làm điều này? Dưới đây là phương pháp tôi gọi để có được nhân viên của tôi:Bản ghi LINQ con null

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; 
    } 
} 

EDIT: Một sự kết hợp của câu trả lời được chấp nhận dưới đây và các ý kiến ​​(tất cả lên-bình chọn) giúp tôi giải quyết việc này (yay!):

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

Có. Đây là nguyên lý cơ bản của LINQ được gọi là Lazy Loading/Deferred Execution. Bạn có thể thấy hữu ích khi đọc một số tài liệu (số lượng lớn) ở đó như: http://www.rizalalmashoor.com/blog/linq-to-entities-deferred-execution-and-lazy-loading/ – mellamokb

+0

Xem: http://msdn.microsoft.com/en-us/library/bb896272 – CodingGorilla

Trả lời

10

Tôi có sai khi nghĩ rằng các hồ sơ trẻ em sẽ được phổ biến?

Tôi đoán rằng nó có thể là các DaysOff được phổ biến một cách lười biếng, nhưng do thời điểm đó EmployeeEntities đã được xử lý. Bạn có thể muốn thử một cái gì đó như:

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

Cũng lưu ý rằng mã của bạn trong báo cáo kết quả using sẽ được viết đơn giản như:

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

Sửa

Đoạn mã trên không đúng. Include phải được sử dụng trên ObjectQuery<T> hoặc IQueryable<T> và không thể được áp dụng cho một số ObjectContext/DbContext. sử dụng đúng là:

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

@CodingGorilla: Tôi hơi bối rối. Ông đã nhận được 'ObjectDisposedException' vì vậy chắc chắn đó có nghĩa là tải lười biếng được kích hoạt? Hay tôi đang thiếu một cái gì đó? – Chris

+1

Jon, bạn đã ở EF phiên bản 19 :) (cho phép "tự động nạp dữ liệu" cho toàn bộ ngữ cảnh ...). Hiện tại bạn không thể áp dụng 'Include' vào một ngữ cảnh, nhưng bạn phải đặt' Include' bên trong các truy vấn riêng lẻ: 'return db.Employees.Include (" DaysOff "). FirstOrDefault ...', v.v. – Slauma

+0

Chris, 'anh' = 'cô'.;) Slauma, cảm ơn nhận xét của bạn. Tôi đã bình chọn bạn vì bạn đã giúp tôi giải quyết vấn đề của mình. – l15a

4

đây là bài nói về việc nạp thực thể con

Using DbContext in EF 4.1 Part 6: Loading Related Entities

háo hức tải các đơn vị có liên quan

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

Rõ ràng nạp các đối tượng có liên quan

var parent = context.parent.Find(1); 
    context.Entry(parent) 
     .Collection(p => p.childs) 
     .Load(); 
Các vấn đề liên quan