2016-06-10 62 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类型会引发编译时错误。 –