SaveChanges или AcceptAllChanges в платформе Entity Framework

Какая разница между _context.SaveChanges и _context.AcceptAllChanges(), является AcceptAllChanges(), является видом перезагрузки данных из базы данных или отбрасывания (отбрасывания) изменений, сделанных пользователем, когда он не использовал SaveChanges()

Ответ 1

Метод ObjectContext.AcceptAllChanges - MSDN

Если был вызван метод SaveChanges и AcceptAllChangesAfterSaveне был указан, пользователь должен вызвать метод AcceptAllChanges. Метод AcceptAllChanges полезен в сценарии, когда транзакция не удалось, и пользователь хочет повторить попытку.

Вы можете увидеть это: http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx

Если вы вызываете SaveChanges() или SaveChanges (true), EF просто предполагает что если его работа завершится хорошо, все будет в порядке, так что это будет отменить изменения, которые он отслеживал, и ждать новых изменений.

К сожалению, если что-то пойдет не так в другом месте в транзакции, поскольку EF отказался от изменений, которые он отслеживал, мы не удается восстановить.

Здесь находятся SaveChanges (false) и AcceptAllChanges().

SaveChanges (false) указывает EF выполнить необходимую базу данных команды, но держитесь за изменения, чтобы их можно было воспроизвести, если необходимо.

Теперь, если более сложная транзакция не удалась, вы можете повторить спецификацию EF бит, с другим вызовом SaveChanges (false). В качестве альтернативы вы можете пройдите через диспетчер состояний, чтобы зарегистрировать то, что не удалось.

После успешной успешной транзакции вы просто вызываете AcceptAllChanges() вручную, и изменения, которые отслеживались отбрасываются.

Ответ 2

Из книги "Доступ к данным с Microsoft.Net Framework 4":

При работе с Entity Framework внесение изменений в база данных автоматически обрабатывается в рамках транзакции, когда вы вызовите метод SaveChanges объекта ObjectContext. Так же Метод AcceptAllChanges автоматически вызывается, если исключение не является брошенный при обновлении, который будет reset состояние всех объектов Без изменений. Хотя метод SaveChanges выполняется в пределах транзакции, вам может потребоваться создать свою собственную транзакцию, если вам нужно для выполнения других операций в рамках одной и той же транзакции