Какое влияние оказывают различные объекты EF 4 SaveOptions на ObjectContext?
Я пытаюсь разрешить ошибку, очень похожую на ту, что описана здесь:
InvalidOperationException при вызове SaveChanges в .NET Entity framework
Похоже, что решение (которое я еще не пробовал, правда) должен передать System.Data.Objects.SaveOptions.None как параметр SaveOptions для метода SaveChanges().
Итак, прежде чем я это сделаю, я пытаюсь понять, как работают различные SaveOptions (None, AcceptAllChangesAfterSave, DetectAllChanges). Однако я не смог найти четкое объяснение, и я не уверен, что такое дефолт. Может ли кто-нибудь уточнить?
Спасибо!
ОБНОВЛЕНИЕ: Я разместил здесь фактический проблемный вопрос: System.InvalidOperationException при попытке итеративного добавления объектов с использованием EF 4
Ответы
Ответ 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