С# EF Code Первое виртуальное ключевое слово, что он делает?

Почему именно нам нужно использовать "виртуальное" ключевое слово при объявлении свойства навигации? Я понимаю, что структура Code First использует ее как-то, чтобы признать, что свойство является навигационным свойством, но я хотел бы знать, как это сделать. В частности, я хотел бы знать, как это относится к описанию, приведенному в документации MSDN для "виртуального" ключевого слова: http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

Ответы

Ответ 1

В среде выполнения Entity Framework создаст для вас то, что называется прокси-сущностями. Эти объекты являются объектами динамически создаваемых типов , которые происходят из типов сущностей.

Это позволяет использовать ваши объекты как POCO, который является простым объектом, который никак не связан с Entity Framework, поскольку он не наследует от EntityObject.

Во время выполнения динамически созданный тип сущности наследуется от вашего POCO и переопределяет все ваши виртуальные свойства, чтобы добавить материал Entity Framework, который позволяет ленивую загрузку в свойствах getters.

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

То же самое для отслеживать изменение.

Ответ 2

Добавление virtual позволяет EF генерировать производный класс, который переопределяет свойство и возвращает набор из базы данных.