Я понимаю разочарование OPs, такое использование виртуального не для шаблонной абстракции, для которой эффективный модификатор defacto эффективен.
Если кто-то все еще борется с этим, я бы предложил свою точку зрения, поскольку я стараюсь сохранить решения простыми и жаргоном к минимуму:
Простая структура Entity Framework использует ленивую загрузку, что эквивалентно подготовке чего-либо для будущего выполнения. Это соответствует модификатору 'virtual', но это еще не все.
В Entity Framework использование свойства виртуальной навигации позволяет обозначать его как эквивалент обнуляемого внешнего ключа в SQL. Вы не должны охотно присоединяться к каждой таблице ключей при выполнении запроса, но когда вам нужна информация - она становится управляемой спросом.
Я также упомянул nullable, потому что многие свойства навигации поначалу не актуальны. т.е. в сценарии клиент / заказы вам не нужно ждать, пока будет обработан заказ, чтобы создать клиента. Вы можете, но если у вас был многоэтапный процесс для достижения этой цели, вам может потребоваться сохранить данные клиента для последующего завершения или для размещения в будущих заказах. Если бы все свойства nav были реализованы, вам нужно было бы установить каждый внешний ключ и реляционное поле при сохранении. Это на самом деле просто возвращает данные обратно в память, что побеждает роль постоянства.
Поэтому, хотя это может показаться загадочным при реальном выполнении во время выполнения, я обнаружил, что лучшее практическое правило для использования будет таким: если вы выводите данные (считываете в модель представления или в сериализуемую модель) и вам нужны значения перед ссылками, не использовать виртуальный; Если ваша область собирает данные, которые могут быть неполными или требовать поиска и не требовать, чтобы каждый поисковый параметр был завершен для поиска, код будет эффективно использовать ссылку, аналогично использованию свойств int со значением nullable. длинный?. Кроме того, абстрагирование вашей бизнес-логики от сбора данных до тех пор, пока не потребуется вводить их, имеет много преимуществ для производительности, подобно созданию экземпляра объекта и его запуску с нуля. Entity Framework использует много отражений и динамики, которые могут ухудшить производительность, и необходимость иметь гибкую модель, которая может масштабироваться по требованию, имеет решающее значение для управления производительностью.
Для меня это всегда имело больше смысла, чем использование перегруженного технического жаргона, такого как прокси, делегаты, обработчики и тому подобное. Как только вы достигнете своего третьего или четвертого языка программирования, он может запутаться в этом.