28

嗨,我刚开始学习使用实体框架代码,我似乎无法理解某些东西。我根据教程创建了三个模型:

public class Course
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public int Credits { get; set; }
    public virtual ICollection<Enrollment> Enrollments{ get; set; }
}

public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public decimal? Grade { get; set; }
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}
public class Student
{
    public int StudentID { get; set; }
    public string LastName { get; set; }
    public string FirstMidName { get; set; }
    public DateTime EnrollmentDate { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

我的问题是我不明白虚拟属性的作用。如果我检查数据库,每个属性都没有列箱,只有其他属性。

那么当您使用 virtual 关键字创建属性时会发生什么?

4

3 回答 3

40

它用于管理延迟加载更改跟踪

EF 将在运行时生成代理类型,这些代理类型是从 POCO 类继承的动态生成的类型,并添加所有 EF 内容以管理覆盖的虚拟属性中的延迟加载/更改跟踪。

所以virtual这里不是“神奇关键字”,virtual而是在这里,因此您的 POCO 可以在运行时通过其他与 EF 相关的代码来继承。

于 2013-03-06T12:47:17.687 回答
7

虚拟属性允许延迟加载

于 2013-03-06T12:43:57.723 回答
3

当您创建使用 virtual 关键字标记的属性或方法时,您将被允许在派生类中覆盖它,从而根据您创建的对象为您的方法提供更专业的行为。

在实体框架的情况下,它也是一个指出使用延迟加载行为的约定。此处存在有关此问题的问题:Entity Framework 4.1 Virtual Properties

于 2013-03-06T12:41:17.820 回答