Entity Framework: работа с отдельными объектами и прикрепленными

Во-первых, позвольте мне изложить то, что я хотел бы сделать. Предположим, у меня есть три типа EntityObject, MetaData, Data1 и Data2. MetaData, как и следовало ожидать, имеет ссылку на один экземпляр каждого из Data1 и Data2. Теперь, для каждого MetaData, я могу вычислить a value.

До сих пор так просто. Теперь я хотел бы, чтобы пользователь играл с различными комбинациями Data1 и Data2, и посмотрел, что они могут получить value. Это, очевидно, требует создания экземпляров MetaData. Теперь, если я не хочу объединять базу данных со всеми этими элементами MetaData, тогда я хотел бы создать объекты сущности в контексте в памяти, не вызывая SaveChanges(), чтобы записать его обратно в БД, Однако это создает проблему в том, что всякий раз, когда я пытаюсь получить доступ к Data1 и Data2 ссылкам в памяти MetaData, я получаю следующее исключение:

InvalidOperationException не обрабатывается

Исходный запрос для этого EntityCollection или EntityReference не может быть возвращен, когда связанный объект находится либо в добавленном состоянии, либо в отключенном состоянии и изначально не был получен с использованием параметра слияния NoTracking.

Если я сделаю так, как было предложено, и "committ" объект для DB, я в конечном итоге столкнулся с проблемой беспорядка.

Во всяком случае, виноватый код выглядит примерно так:

MetaData temp = MetaData.CreateMetaData(0);
MetaData.Data1 = <existing data1="" from="" context="">;
MetaData.Data2 = <existing data2="" from="" context="">;
//Exception here
if (!MetaData.Data1Reference.isLoaded)
 MetaData.Data1Reference.Load();
</existing></existing>

Кажется, этот парень имел аналогичную проблему.

1 ответ

IsLoaded применим только для свойств экземпляров, которые были реализованы из базы данных. Как вы обнаружили, он не возвращает полезную информацию для экземпляров, которые не были реализованы из базы данных.

Следовательно, вы должны изменить способ проверки того, хотите ли вы вызвать Load(). Если вы знаете, что будете работать с экземплярами MetaData, которые были созданы только в памяти, а не материализованы из базы данных, вы можете написать код следующим образом:

if ((temp.EntityState != System.Data.EntityState.Added) && 
 (!temp.Data1Reference.IsLoaded)) temp.Data1Reference.Load();

Я замалчиваю некоторые тонкости, здесь. Для начала EntityState объявляется с помощью FlagsAttribute, поэтому он может содержать Добавленный без равного Добавлен. Кроме того, ничто из этого не требуется, если Data1Reference не является нулевым, поэтому вы можете просто попробовать сначала проверить это. Дело в том, что вы можете написать код, который соответствует вашей ситуации, но он должен учитывать полное состояние temp, а не только его свойства.

licensed under cc by-sa 3.0 with attribution.