延迟加载在Entity Framework

时间:2015-05-14 23:08:15

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

我有两个使用virtual关键字连接的类:

学生:

public class Student
{
    public int StudentId{get; set;}
    public string LastName { get; set; }
    public string FirstName { 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 decimal? Grade { get; set; }
    public virtual Course course { get; set; }
    public virtual Student student { get; set; }
}

两个表都已填充,并且具有相应的记录(例如,有一个id为1的学生和一个id为1的学生的注册)。

我通过它的身份提取学生并将其发送到视图

Student student = db.Students.Find(id);
return View(student);

在视图中,我可以显示该学生的详细信息。 @Model确实包含Enrollment属性(至少它出现在intellisense中并且没有红线),但它是Null

还有一门课程:

{
    public int CourseId { get; set; }
    public String CourseName { get; set; }
    public int TotalCredits { get; set; }
}

由于@Model.EnrollmentsNull,我无法访问@Model.Enrollment.CourseNamae

修改 我刚尝试了一个黑客解决方法:

IEnumerable<Student> temp = db.Students.Include(s => s.Enrollments);
Student student = temp.FirstOrDefault(s => s.StudentId.Equals(id));
return View(student);

这给了我第二行的错误:

  

System.InvalidOperationException:指定的包含路径无效。 EntityType&#39; MyFirstProject2.Models.Student&#39;不会声明名称为&#39; Enrollments&#39;。

的导航属性

这是否提供了任何线索?

1 个答案:

答案 0 :(得分:1)

有点晚了,但Lazy Loading vs Eager Loading

之间有一些解释

以及延迟加载的规则

  1. context.Configuration.ProxyCreationEnabled应为true。
  2. context.Configuration.LazyLoadingEnabled应为true。
  3. 导航属性应定义为public,virtual。如果未将属性定义为,则Context不会进行延迟加载 虚拟的。
  4. 修改: 关系使用的最后一件事:

    public virtual ICollection<Enrollment> Enrollments { get; set; }
    

    其他链接:

    Lazy Loading

    Eager Loading

    Explicit Loading