2011-04-23 72 views
3

我有類調用課程,學生和教師這樣實體框架Find方法不能正常工作

public class Course 
    { 
     [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
     public Guid CourseId { set; get; } 
     public ICollection<Student> Students { set; get; } 
     public Teacher Teacher { get; set; }  

    } 



public class Student 
    { 
     [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
     public Guid StudentId { set; get; } 
     public ICollection<Course> Courses { set; get; } 
    } 




public class Teacher 
    { 
     [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
     public Guid TeacherId { get; set; } 
     public ICollection<Course> Courses { get; set; } 
    } 

我試圖找主鍵的過程如下

Course c = _unitOfWork.DbContext.Set<Course>().Find(keyValue); 

我得到的課程對象來自數據庫,但課程的學生和教師屬性爲空

我是否缺少什麼? 謝謝

回答

12

Find工作正常,因爲EF永遠不會加載相關實體本身。要加載相關屬性,您必須使用預先加載或延遲加載。第三個選項有時被稱爲顯式加載。

延遲加載將爲您提供相關實體的自動加載,但它會生成對數據庫的附加查詢。首次訪問該屬性時,相關實體或相關集合將被加載。要使用延遲加載,您必須將實體中的所有導航屬性標記爲virtual(@ckal爲您提供了一個示例)。只有當用於加載主實體的上下文仍然存在時,延遲加載纔有效。

緊急加載將定義哪個關係必須與主實體一起加載。急切的加載由Include方法執行。你可以重寫Find爲:

Course c = _unitOfWork.DbContext 
         .Set<Course>() 
         .Include(c => c.Students) 
         .Include(c => c.Teacher) 
         .SingleOrDefault(c => c.CourseId == keyValue); 

明確載入將讓你明確地說,一些關係應該被加載。你甚至可以定義一些加載相關實體的條件,而其他兩種方法是不可能的。您必須首先加載主要實體,在處理上下文之前,您可以執行類似操作:

context.Entry(course).Collection(c => c.Students).Load(); 
+0

是的,它工作,很棒:) – 2011-04-24 04:21:36

4

virtual添加到您的導航特性以啓用延遲加載。

public class Course 
{ 
    [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
    public Guid CourseId { set; get; } 
    public virtual ICollection<Student> Students { set; get; } 
    public virtual Teacher Teacher { get; set; } 
}