Это происходит потому, что ents.EntityObject.WhatEver всегда запрашивает источник данных. Это дизайнерское решение. Они делают это таким образом, потому что иначе им придется выполнить запрос к источнику данных, к локальному кешу, а затем объединить результаты. Как отметил один из разработчиков в блоге (не могу вспомнить, где именно), они не смогли справиться с этим последовательно.
Как вы можете себе представить, есть много угловых случаев, с которыми вы должны обращаться правильно. Вы можете просто найти идентификатор, который вы создали локально, созданный кем-то еще в базе данных. Это заставит вас быть готовым к обработке конфликтов (почти) на каждый запрос. Возможно, они могли бы создать методы для запроса локального кэша и методы для запроса источника данных, но это не слишком умно.
Вы можете взглянуть на Прозрачная отложенная загрузка для Entity Framework . Это заменяет обычный генератор кода, и вы получаете сущности, которые автоматически заполняют связанные коллекции сущностей и ссылки на сущности при доступе. Это позволяет избежать всего
if (!Entity.ReleatedEntities.IsLoaded)
{
Entity.RelatedEntities.Load();
}
фрагменты кода. И вы можете запросить коллекции, потому что они всегда загружаются неявно. Но и это решение не идеально. Есть некоторые проблемы. Например, если вы создаете новую сущность и получаете доступ к коллекции связанных сущностей, вы получите исключение, потому что код не может извлечь связанные сущности из базы данных. Существует также проблема, связанная с привязкой данных, и, возможно, я еще не знаю о ней.
Хорошо, что вы получаете исходный код и можете решить проблемы самостоятельно, и я собираюсь рассмотреть первую проблему, если найду время. Но я совершенно уверен, что это будет не так легко исправить, потому что я ожидаю, что некоторые случаи просто не попали в базу данных, если созданная сущность не является ожидаемым поведением.