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

c# entity-framework

Вопрос

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

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

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

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

Если я сделаю то, что предложено, и "передам" объект в БД, я столкнусь с проблемой беспорядка.

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

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();

Кажется, у этого парня была похожая проблема.

Принятый ответ

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

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

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

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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему