Почему именно нам нужно использовать "виртуальное" ключевое слово при объявлении свойства навигации? Я понимаю, что структура Code First использует ее как-то, чтобы признать, что свойство является навигационным свойством, но я хотел бы знать, как это сделать. В частности, я хотел бы знать, как это относится к описанию, приведенному в документации MSDN для "виртуального" ключевого слова: http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx
С# EF Code Первое виртуальное ключевое слово, что он делает?
Ответ 1
В среде выполнения Entity Framework создаст для вас то, что называется прокси-сущностями. Эти объекты являются объектами динамически создаваемых типов , которые происходят из типов сущностей.
Это позволяет использовать ваши объекты как POCO, который является простым объектом, который никак не связан с Entity Framework, поскольку он не наследует от EntityObject
.
Во время выполнения динамически созданный тип сущности наследуется от вашего POCO и переопределяет все ваши виртуальные свойства, чтобы добавить материал Entity Framework, который позволяет ленивую загрузку в свойствах getters.
Lazy loading - сложный процесс, который требует, чтобы ваш код знал о том, как данные поступают из базы данных. Поскольку вы не хотите, чтобы ваши классы домена знали о базе данных и материалах EF, вы абстрагируете свои сущности из EF и добавляете виртуальные свойства, поэтому EF может переопределить вашу базовую POCO и добавить ее связанные с DB вещи во время выполнения.
То же самое для отслеживать изменение.
Ответ 2
Добавление virtual
позволяет EF генерировать производный класс, который переопределяет свойство и возвращает набор из базы данных.