_context.SaveChanges
との違いは、_context.AcceptAllChanges()
データベースAcceptAllChanges()
からデータをリロードするか、ユーザーが使用していないときにユーザーが行った変更をロールバック (破棄) することです。SaveChanges()
2 に答える
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 に指示しますが、必要に応じて変更を再生できるように変更を保持します。
より広範なトランザクションが失敗した場合は、SaveChanges(false) をもう一度呼び出して、EF 固有のビットを再試行できます。別の方法として、state-manager をウォークスルーして、何が失敗したかをログに記録することもできます。
より広範なトランザクションが成功したら、手動で AcceptAllChanges() を呼び出すだけで、追跡されていた変更は破棄されます。
Accessing Data with Microsoft .Net Framework 4 book から:
Entity Framework を操作する場合、データベースへの変更の送信は、ObjectContext オブジェクトで SaveChanges メソッドを呼び出すと、トランザクション内で自動的に処理されます。また、更新時に例外がスローされない場合、AcceptAllChanges メソッドが自動的に呼び出され、すべてのオブジェクトの状態が Unchanged にリセットされます。SaveChanges メソッドはトランザクション内で実行されますが、同じトランザクション内で他の操作を実行する必要がある場合は、独自のトランザクションを作成する必要がある場合があります。