-2

データベースのフロント エンドの作成に問題があります。データベースからの EF6 Code First から始めました。コントローラーを作成し、作成ページでテストを実行しましたが、大きな問題が発生しました。次のエラーが表示されました。

 System.Data.SqlClient.SqlException: Transaction failed in database 'DB' because the statement was run under snapshot isolation but the transaction did not start in snapshot isolation. You cannot change the isolation level of the transaction to snapshot after the transaction has started unless the transaction was originally started under snapshot isolation level.

他に表示されたのは、コントローラーからのコードです。

if (ModelState.IsValid)
{
    db.Characters.Add(character);
    await db.SaveChangesAsync();
    return RedirectToAction("Index");
}

await db.SaveChangesAsync(); が強調表示されました。エラー行として。そのため、MVC コードのトランザクション レベルを変更するためにどこを見ればよいのか混乱しています。Web.config、データベース用に作成されたモデル、またはコントローラーのいずれでしょうか? 変更するには TransactionScope を使用する必要があることはわかっています。
デフォルトのトランザクション スコープをデータベースの設定対象に変更する方が簡単です。その変更をどこで行うべきかわかりませんか?

4

1 に答える 1

0

コンテキストのコンストラクターで、EF必要な次のパスを呼び出すことができIsolationLevelます

_ContextTransaction = Database.BeginTransaction(isolationLevel)

次に、コンテキストでをオーバーライドするSaveChangesAsyncことにより、トランザクションをコミットできます

public override Task<int> SaveChangesAsync() {
    var result = base.SaveChangesAsync();
    _ContextTransaction.Commit();

}

Commit他のメソッドでもトランザクションが必要になることに注意してくださいSaving。新しいトランザクションを開始する前に、コンテキストが別のトランザクションの一部であるかどうかをテストすることも検討してください。BeginTransaction(isolationLevel)

使用できる現在のトランザクションを確認するにはSystem.Transactions.Transaction.Current

于 2015-08-17T05:23:12.560 に答える