gpt4 book ai didi

linq-to-entities - Entity Framework 查找方法无法正常工作

转载 作者:行者123 更新时间:2023-12-03 18:27:26 24 4
gpt4 key购买 nike

我有这样的类(class),叫做类(class)、学生和老师

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

我正在尝试按主键获取类(class)如下
Course c = _unitOfWork.DbContext.Set<Course>().Find(keyValue);

我从数据库中获取类(class)对象,但类(class)的学生和教师属性为空

我错过了什么吗??
谢谢

最佳答案

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

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

关于linq-to-entities - Entity Framework 查找方法无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com