Понимание первых виртуальных свойств кода

Привет, я просто учился работать с Entity Framework Code First, и я не могу что-то понять. Я создал три модели на основе учебника:

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?

Ответ 1

Он используется для управления ленивой загрузкой и отслеживанием изменений.

EF будет генерировать типы прокси во время выполнения, которые являются динамически генерируемыми типами, которые наследуются от ваших классов POCO и добавляют все элементы EF для управления ленивым отслеживанием загрузки/изменения в переопределенных виртуальных свойствах.

Таким образом, virtual версия не является "волшебным ключевым словом" здесь, virtual здесь, поэтому ваши POCOs могут быть унаследованы дополнительным кодом, связанным с EF, во время выполнения.

Ответ 2

Виртуальные свойства позволяют ленивую загрузку

Ответ 3

Когда вы создаете свойство или метод, помеченные ключевым словом virtual, вам будет разрешено переопределить его в производном классе, тем самым предлагая вашему методу более специализированное поведение в зависимости от создаваемых вами объектов.

В случае с Entity Framework это также соглашение, указывающее на то, что используется ленивое поведение загрузки. Вопрос по этому вопросу существует здесь: Entity Framework 4.1 Виртуальные свойства