-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 回答