导航属性未在延迟加载时填充

时间:2016-06-10 10:24:57

标签: asp.net-mvc entity-framework asp.net-mvc-4

我正在尝试在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的代码优先技术。我的DB Context Class如下

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

这里的问题是当在控制器中调用Find()方法时,Student Class模型中的导航属性为null。但是DB中的数据对应于正在传递的id。简而言之,导航属性是不返回数据(null)。

1 个答案:

答案 0 :(得分: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;