2016-06-10 50 views
0

我正在嘗試在mvc官方網站上給出的mvc示例上的動手。 在這裏,我有3個模型學生,課程和註冊,在課程和註冊實體之間存在一對多關係,並在註冊和學生中建立多對一的關係。是導航屬性沒有得到延遲加載

的學生,課程和招生模式與導航屬性標記爲「虛擬」的,因爲我需要執行延遲綁定

public class Student 
    { 
     public int StudentID { get;set; } 
     public string LastName { get; set; } 
     public string FirstMidName { get; set; } 
     public DateTime EnrollmentDate { get; set; } 
     public virtual IEnumerable<Enrollment> Enrollments { get; set; } 
    } 

以同樣的方式,我有我的課程模式如下

我報名型號

public class Enrollment 
    { 
     public int EnrollmentID { get; set; } 
     public int CourseID { get; set; } 
     public int StudentID { get; set; } 
     // public Grade? Grade { get; set; } 

     public virtual Course Course { get; set; } 
     public virtual Student Student { get; set; } 
    } 

我使用代碼優先技術隨着EF 5.My DB上下文類是如下

public class SchoolContext:DbContext 
    { 


     public DbSet<Student> Students { get; set; } 
     public DbSet<Enrollment> Enrollments { get; set; } 
     public DbSet<Course> Courses { get; set; } 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
     } 
    } 

腳手架我已經生成的所有我的看法。對我的點擊詳細操作環節我有一個被稱爲

public ActionResult Details(int id = 0) 
     { 

      db.Configuration.LazyLoadingEnabled = true; 
      db.Configuration.ProxyCreationEnabled = true; 
      Student student = db.Students.Find(id); 
      // db.Entry(student).Reference(p => p.Enrollments).Load(); 
      IEnumerable<Enrollment> s= student.Enrollments; 
      if (student == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(student); 
     } 

這裏的問題是,當查找()方法被調用的控制器功能控制器的Student類模型中的導航屬性爲null。但DB中的數據對應於正在傳遞的id。簡而言之,導航屬性不返回數據(null)。

+0

使用'.INCLUDE()'...參考[這裏] (http://stackoverflow.com/questions/26661771/what-does-include-do-in-linq)和[this](http://stackoverflow.com/questions/5648154/include-in-linq-to-實體 - 查詢)帖子。 –

+0

這很好.....但我更喜歡延遲加載。請告訴我我在哪裏做錯了。 –

+0

嘗試修改你的學生類,通過創建一個構造函數並添加以下內容。註冊= new Hashset (); – uk2k05

回答

0

你必須兌現的實體,以獲得擺脫目前的延遲加載在查詢:

Student student = db.Students.Find(id).ToList(); 

這將db.Students.Find(ID)後解決您的問題,而ToList(); =會從動態代理中返回生成的對象。

問題二你有鑄造缺陷:

IEnumerable<Enrollment> enrollments = student.Enrollments; // is wrong 

應該是:

ICollection<State> enrollments = student.Enrollments; 

var enrollments = student.Enrollments; 
+0

我不清楚這個答案。請你詳細說明..Here Find()方法返回一個類型爲Student的對象並將其轉換爲Enumerable類型會引發編譯時錯誤。 –