2009-10-17 2 views
1

Я загружаю диаграмму связанных объектов из базы данных с помощью ADO.NET MVC и Entity Framework. Один из объектов должен быть изменен в памяти, но изменения не сохраняются в базе данных при изменении других объектов на графике.Как создать объект только для чтения в структуре сущности?

В настоящее время я попытался использовать MergeOption.NoTracking и MergeOption.OverwriteChanges, но оба они кажутся проигнорированными, и любые изменения в наборе объектов, которые не должны быть изменены, сохраняются в хранилище.

Фрагмент кода, который я использую для загрузки сущности графа из базы данных приведены ниже:

QuizDBEntities entities = new QuizDBEntities(); 
ObjectParameter[] searchParameters = { new ObjectParameter("contestantID", contestantID) }; 
entities.QuestionSet.MergeOption = MergeOption.NoTracking; 

var query = entities.ContestantSet 
    .Include("Quiz.Questions.Categories.Options.Answer") 
    .Include("Answers") 
    .Include("Quiz.Questions.Filters.FilterAnswers") 
    .Where("it.ContestantID == @constestantID", searchParameters); 

Contestant contestant = query.First(); 

Я также попытался установить MergeOption после того, как запрос выполнен, но перед казнью.

Любая помощь была бы принята с благодарностью.

+0

Где вы установили MergeOption после того, как запрос был сконструирован, на entity.QuestionSet.MergeOption или на переменной «query»? –

+0

Прошло почти 2 года с этого поста, вы нашли обходное решение? – tkerwood

ответ

1

Характер проблемы у вас есть в том, как EF имеет дело с отношениями. В EF отношения являются членами первого класса, как и сущности. Вот почему диаграмма объектов, которую вы извлекаете, на самом деле представляет собой совокупность сущностей и отношений. Все сущности и отношения внутри контекста объекта либо связаны с контекстом объекта, либо отключены. Это Entity Каркасы «Платиновое правило»:

Когда я первый заметил, что компания была присоединена к ObjectContext хотя я не был явно вызывается для этого в моем коде, я был немного ошеломлен потому что я доверял Entity Framework не нарушать то, что я считал «золотым правилом», то есть не сделал бы ничего, о чем я конкретно не говорил. Как только я понял, почему сущности автоматически привязаны к контексту, когда я привязывал их к графику, и почему это было необходимо, я решил, что это должно быть платиновое правило Entity Framework, потому что оно отменяет золотое правило.

Juile Лерман, Программирование Entity Framework

«Золотое правило» говорит, что EF никогда не будет делать то, что вы прямо не сказать ему делать.

Таким образом, объект «только для чтения» является отдельным объектом. Вы можете достичь этого так, как вы уже делали. или если вы вызываете метод Detach в ObjectContext. Объекты в объектном графе могут быть либо прикреплены либо отделены от ObjectContext.

+0

На самом деле не отвечает на вопрос. Просто указывает на очевидное. – Justin

+0

Ну, это объясняет, почему он ведет себя так, как ведет себя. И это указывает на очевидное - вы не можете иметь прикрепленные и отдельные объекты внутри одного и того же графа. Я думаю, вам достаточно переосмыслить и реорганизовать ваше решение, чтобы реализовать то, что вы начали. Однако я добавил пару слов, которые непосредственно отвечают на ваш вопрос. И, извините, если вы потеряли время, читая этот ответ ... –

Смежные вопросы