2012-07-20 24 views
8

Veritabanı şemasını oluşturmak ve kodumu oluşturmak için Entity Framework'ü kullandım. DaysOff tablosunda çocuk kayıtları olan Çalışan isimli bir masa var. DaysOff Çalışan için bir yabancı anahtarı var ve benim modelimde 1 ila * birliği var. Çalışan tablosu üzerinde bir LINQ sorgusu çalıştırdım ve Domain.Employee nesnesinin DaysOff ile doldurulması bekleniyordu, ancak DaysOff boştur. Nesne içinde incelediğimde, "employee.DaysOff.Count, System.ObjectDisposedException türünde bir istisna attı" konusuna bakın. Çocuk kayıtlarının doldurulacağını düşünmek yanlış mıyım? Bunu nasıl yapardım? İşte benim Çalışan almak için çağrı yöntemdir:LINQ çocuk kayıtları sıfır

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

DÜZENLEME: aşağıda kabul edilen yanıt ve yorumlar kombinasyonu bana yardımcı (yukarı-olarak tümü) bu (yay!) Çözmek için:

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

Evet. Bu, Lazy Yükleme/Ertelenmiş Yürütme olarak adlandırılan LINQ'in temel ilkesidir. Http://www.rizalalmashoor.com/blog/linq-to-entities-deferred-execution-and-lazy-loading gibi bazı (büyük miktarda) belgelerin okunmasını yararlı bulabilirsiniz./ – mellamokb

+0

Bakınız: http://msdn.microsoft.com/en-us/library/bb896272 – CodingGorilla

cevap

10

Çocuk kayıtlarının doldurulacağını düşünmemek yanlış mıyım?

Ben o DaysOff lazily doldurulduğunu olabilir tahmin değilim, ama bu noktada EmployeeEntities tarafından bertaraf edilmiştir. Sen gibi bir şey denemek isteyebilirsiniz:

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

Ayrıca using açıklamada kodunuzu daha basit yazılı olacağını unutmayın olarak:

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

Edit

Yukarıdaki kod Doğru değil. Include, ObjectQuery<T> veya IQueryable<T> üzerinde kullanılmalıdır ve ObjectContext/DbContext'a uygulanamaz. Doğru kullanım şöyledir:

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

@CodingGorilla: Kafam biraz karışık. “ObjectDisposedException” ifadesini o kadar kesin bir şekilde aldı ki, bu da tembel yükleme olanağı sağlıyor mu? Yoksa bir şey mi özlüyorum? – Chris

+1

Jon, zaten EF sürüm 19'dasınız :) (tüm içerik örneği için "otomatik istekli yüklemeyi" etkinleştir ...). Şu anda 'Include' öğesini bir içeriğe uygulayamazsınız, ancak 'Include' öğesini tek tek sorguların içine koymalısınız: 'db.Employees.Include (" DaysOff "). FirstOrDefault ...', vb – Slauma

+0

Chris, 'o' = 'o'.;) Slauma, yorumunuz için teşekkürler. Seni oyladım çünkü sorunumu çözmeme yardım ettin. – l15a

4

çocuk varlığın yükleme hakkında yazılan görüşmeler Using DbContext in EF 4.1 Part 6: Loading Related Entities

Merakla yükleme İlgili öğe

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

Açıkça yükleniyor ilgili kişiler

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