Подтвердить что ты не робот

Какое влияние оказывают различные объекты EF 4 SaveOptions на ObjectContext?

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

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

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

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

Спасибо!

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

4b9b3361

Ответ 1

Хороший вопрос (+1).

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

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

SaveOptions.AcceptAllChangesAfterSave: Когда вы выполняете ObjectContext.SaveChanges(), метод AcceptAllChanges() - это мужество OSM, где объекты на графике повторяются, адреса и устанавливаются в Unchanged/Detached.

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

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

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

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

Ответ 2

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

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

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

SaveChanges(SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSave)

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