实体框架包含在没有虚拟的情况下不起作用

时间:2018-02-06 13:02:03

标签: c# entity-framework orm lazy-loading

我的数据库和EF映射中有两个表(toggle_next = Toggle(label='Toggle Next', button_type='success') def update_next(): """This function shows the next 10 points in the data""" toggle_next.on_click(update_next) 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;
    }
}

这很好用。但在那之后,我决定关闭LazyLoading for Courses属性,因为我决定通过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

virtual

这确实有助于关闭LazyLoading,但public ICollection<Course> Courses { get; set; } 停止工作,我的Include集合从未加载。

所以问题是:是否可以在禁用LazyLoading的情况下为Courses集合进行急切加载?

P.S。我实际上并没在我的应用程序中使用实体对象,而是将它们转换为我的Domain对象。这就是为什么我决定使用Courses字段而不是实际使用LazyLoading。

另外,我想将一个SELECT查询(当然是JOIN)发送到数据库而不是两个单独的SELECT。

1 个答案:

答案 0 :(得分:1)

在提出问题后不久,我找到了一个简单明了的答案:if(loadCourses)下有一个我没有分配teacherQuery的错误。固定代码看起来像这样,工作正常:

if(loadCourses)
{
    teacherQuery = teacherQuery.Include(t => t.Courses);
}

还想提一下@VidmantasBlazevicius提供的useful link。它包含virtual关键字如何影响您的实体的答案。