[解決済み] トランザクションを使用するか、SaveChanges(false)とAcceptAllChanges()を使用するか?
質問
トランザクションを調査したところ、EFでは、以下をパスしている限り、勝手に処理されるようです。
false
から
SaveChanges()
を呼び出して
AcceptAllChanges()
は、エラーがなければ
SaveChanges(false);
// ...
AcceptAllChanges();
何か問題が発生した場合、ロールバックする必要はないのでしょうか?それとも、私のメソッドがスコープ外に出た時点で、トランザクションは終了するのでしょうか?
トランザクションの途中で割り当てられたindentiyカラムはどうなるのでしょうか?もし他の人が私のレコードの後にレコードを追加し、私のレコードが不良になった場合、Identityの値が欠落することを意味すると推測される。
標準の
TransactionScope
クラスを使用することはできますか?
どのように解決するのですか?
Entity Frameworkの場合、ほとんどの場合
SaveChanges()
で十分です。これはトランザクションを作成するか、または任意のアンビエントトランザクションに参加し、そのトランザクション内で必要なすべての作業を行います。
時には
SaveChanges(false) + AcceptAllChanges()
のペアリングが有効です。
最も便利なのは、2つの異なるContextsにまたがって分散トランザクションを行いたい場合です。
すなわち、こんな感じです(悪)。
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save and discard changes
context1.SaveChanges();
//Save and discard changes
context2.SaveChanges();
//if we get here things are looking good.
scope.Complete();
}
もし
context1.SaveChanges()
は成功するが
context2.SaveChanges()
そのため、失敗を再生したり、効果的にログを記録することができません。
しかし、コードをこのように変更すると。
context1
を呼び出している間に
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save Changes but don't discard yet
context1.SaveChanges(false);
//Save Changes but don't discard yet
context2.SaveChanges(false);
//if we get here things are looking good.
scope.Complete();
context1.AcceptAllChanges();
context2.AcceptAllChanges();
}
は必要なコマンドをデータベースに送りますが、 コンテキスト自体は変更されないので、必要ならもう一度実行するか、あるいは
SaveChanges(false)
を使用します。
これは、トランザクションが実際に例外をスローした場合、再試行するか、各コンテキストの状態をログに記録することで補うことができることを意味します。
ObjectStateManager
のどこかにあるはずです。
関連
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] AddTransient、AddScoped、AddSingleton サービスの相違点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015