Какое влияние оказывают различные EO 4 SaveOptions на ObjectContext? - PullRequest
31 голосов
/ 12 января 2011

Я пытаюсь устранить ошибку, очень похожую на описанную здесь:

InvalidOperationException при вызове SaveChanges в .NET Entity Framework

Похоже, что решение (которое я еще не пробовал, по общему признанию) заключается в передаче System.Data.Objects.SaveOptions.None в качестве параметра SaveOptions для метода SaveChanges ().

Поэтому, прежде чем я это сделаю, я пытаюсь понять, как именно работают разные SaveOptions (Нет, AcceptAllChangesAfterSave, DetectAllChanges). Однако я не смог найти четкого объяснения этому, и я не уверен, что по умолчанию. Кто-нибудь может уточнить?

Спасибо!

ОБНОВЛЕНИЕ: Я разместил актуальный проблемный вопрос здесь: System.InvalidOperationException при попытке итеративно добавить объекты с помощью EF 4

Ответы [ 2 ]

18 голосов
/ 09 ноября 2011

Короткая коррекция для

SaveOptions.DetectChangesBeforeSave: это значение по умолчанию.При выполнении ObjectContext.SaveChanges () метод DetectChanges () вызывается для синхронизированных объектов присоединения в OSM.

SaveChanges - перегруженная версия метода SaveChanges(SaveOptions optsions), где эта безпараметрическая версия вызывает это

SaveChanges(SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSave)

SaveOptions - это перечисление Flag, и в заключение, SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSave является значением по умолчанию SaveChanges(), а не DetectChangesBeforeSave

17 голосов
/ 13 января 2011

В двух словах (из того, что я понимаю):

SaveOptions.DetectChangesBeforeSave: это значение по умолчанию. Когда вы делаете ObjectContext.SaveChanges () , метод DetectChanges () вызывается для синхронизированных объектов присоединения в OSM.

SaveOptions.AcceptAllChangesAfterSave: когда вы делаете ObjectContext.SaveChanges () , вызывается метод AcceptAllChanges () - который является внутренностями OSM, где сущности в графе итерированы, адреса и установлены на неизмененные / отключенные.

SaveOptions.None: Когда вы делаете ObjectContext.SaveChanges () , изменения сохраняются сразу - никакой синхронизации вообще нет. Все, что находится на графике, - это то, что будет сохранено.

По моему опыту, я не изменил это - я оставил его по умолчанию (DetectChangesBeforeSave).

Иногда с POCO я слышал, что вам нужно явно позвонить DetectChanges, но я никогда не видел рекомендации / решения, чтобы изменить SaveOptions на none.

Вы уверены, что решением в этом вопросе является установка SaveOptions на none? Возможно, вам следует предоставить подробную информацию (или задать отдельный вопрос) об ошибке, которую вы получаете, поскольку подобное изменение повлияет на весь ваш уровень персистентности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...