实体框架查找方法无法正常工作

tah*_*ala 4 linq-to-entities code-first entity-framework-4.1

我有像这样的课程,学生和老师

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; }
    }
Run Code Online (Sandbox Code Playgroud)

我试图按主键获取课程如下

Course c = _unitOfWork.DbContext.Set<Course>().Find(keyValue);
Run Code Online (Sandbox Code Playgroud)

我从数据库中获取课程对象,但课程的学生和教师属性为空

我错过了什么?谢谢

Lad*_*nka 13

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);
Run Code Online (Sandbox Code Playgroud)

显式加载将允许您明确说明应该加载某些关系.您甚至可以为加载相关实体定义一些条件,这是其他两种方法无法实现的.您必须先加载主实体,然后在处理上下文之前,您可以执行以下操作:

context.Entry(course).Collection(c => c.Students).Load();
Run Code Online (Sandbox Code Playgroud)