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