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)
| 归档时间: |
|
| 查看次数: |
4293 次 |
| 最近记录: |