Entity Framework 没有虚拟就无法包含

Entity Framework Include doesn't work without virtual

我的数据库和 EF 映射中有两个表(TeacherCourse):

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 关键字如何影响您的实体的答案。