Entity Framework 没有虚拟就无法包含
Entity Framework Include doesn't work without virtual
我的数据库和 EF 映射中有两个表(Teacher
和 Course
):
public partial class Teacher
{
public long Id { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
我这样加载老师:
public Teacher GetTeacher(long id)
{
using(var entities = new MyEntities())
{
var teacher = entities.Teachers.Where(t => t.Id == id).FirstOrDefault();
return teacher;
}
}
现在有时我想为我的老师加载课程列表。所以我改变了这样的实现:
public Teacher GetTeacher(long id, bool loadCourses)
{
using(var entities = new MyEntities())
{
var teacherQuery = entities.Teachers.Where(t => t.Id == id);
if(loadCourses)
{
teacherQuery.Include(t => t.Courses);
}
return teacherQuery.FirstOrDefault();
}
}
这很好用。但在那之后,我决定关闭课程 属性 的延迟加载,因为我决定通过 loadCourses
字段手动控制它。
所以我刚刚从课程 collection:
中删除了 virtual
public ICollection<Course> Courses { get; set; }
这确实有助于关闭延迟加载,但 Include
停止工作并且我的 Courses
collection 从未加载。
所以问题是:是否可以在禁用 LazyLoading 的情况下为 Courses
collection 进行预加载?
P.S。我实际上并没有在我的应用程序中使用实体 objects,而是将它们转换为我的域 objects。所以这就是为什么我决定使用 bool loadCourses
字段而不是实际使用 LazyLoading 的原因。
此外,我希望将一个 SELECT 查询(当然是 JOIN)发送到数据库,而不是两个单独的 SELECTs。
提问后不久,我找到了一个非常简单的答案:if(loadCourses)
下有一个错误,我没有分配 teacherQuery
。固定代码看起来像这样并且工作正常:
if(loadCourses)
{
teacherQuery = teacherQuery.Include(t => t.Courses);
}
还想提一下@VidmantasBlazevicius 提供的 useful link。它包含有关 virtual
关键字如何影响您的实体的答案。
我的数据库和 EF 映射中有两个表(Teacher
和 Course
):
public partial class Teacher
{
public long Id { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
我这样加载老师:
public Teacher GetTeacher(long id)
{
using(var entities = new MyEntities())
{
var teacher = entities.Teachers.Where(t => t.Id == id).FirstOrDefault();
return teacher;
}
}
现在有时我想为我的老师加载课程列表。所以我改变了这样的实现:
public Teacher GetTeacher(long id, bool loadCourses)
{
using(var entities = new MyEntities())
{
var teacherQuery = entities.Teachers.Where(t => t.Id == id);
if(loadCourses)
{
teacherQuery.Include(t => t.Courses);
}
return teacherQuery.FirstOrDefault();
}
}
这很好用。但在那之后,我决定关闭课程 属性 的延迟加载,因为我决定通过 loadCourses
字段手动控制它。
所以我刚刚从课程 collection:
中删除了virtual
public ICollection<Course> Courses { get; set; }
这确实有助于关闭延迟加载,但 Include
停止工作并且我的 Courses
collection 从未加载。
所以问题是:是否可以在禁用 LazyLoading 的情况下为 Courses
collection 进行预加载?
P.S。我实际上并没有在我的应用程序中使用实体 objects,而是将它们转换为我的域 objects。所以这就是为什么我决定使用 bool loadCourses
字段而不是实际使用 LazyLoading 的原因。
此外,我希望将一个 SELECT 查询(当然是 JOIN)发送到数据库,而不是两个单独的 SELECTs。
提问后不久,我找到了一个非常简单的答案:if(loadCourses)
下有一个错误,我没有分配 teacherQuery
。固定代码看起来像这样并且工作正常:
if(loadCourses)
{
teacherQuery = teacherQuery.Include(t => t.Courses);
}
还想提一下@VidmantasBlazevicius 提供的 useful link。它包含有关 virtual
关键字如何影响您的实体的答案。