首先理解代码中的虚拟属性

本文关键字:虚拟 属性 代码 | 更新日期: 2023-09-27 18:02:26

嗨,我只是学习与实体框架代码第一工作,我似乎不能理解的东西。我根据教程创建了三个模型:

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的属性是做什么的。如果我检查数据库,没有每个属性的列箱,只有其他属性的列箱。

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

首先理解代码中的虚拟属性

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

EF将在运行时生成代理类型,这是动态生成的类型,继承你的POCO类,并添加所有EF的东西来管理延迟加载/更改跟踪在覆盖的虚拟属性

所以virtual在这里不是一个"魔法关键字",virtual在这里,所以你的poco可以在运行时继承额外的ef相关代码。

虚拟属性允许延迟加载

当你创建一个标有virtual关键字的属性或方法时,你将被允许在派生类中重写它,从而根据你创建的对象为你的方法提供更专门的行为。

在实体框架的情况下,它也是一个约定,指出使用延迟加载行为。关于这个问题存在一个问题:实体框架4.1虚拟属性