如何在ASP.NET MVC identity 2中使用事务?

如何在ASP.NET MVC identity 2中使用事务?,asp.net,asp.net-mvc,asp.net-identity,identity,Asp.net,Asp.net Mvc,Asp.net Identity,Identity,在我的ASP.NET MVC5 Identity 2应用程序中,尝试使用事务,但它不工作。请参阅下面的代码,说明事务不工作。如果var saveteacher=\u teacherService.Create(aTeacher)未成功插入,则AspNetUsers无法从数据库回滚 代码: 我认为问题可能出在异步方面 尝试按如下方式创建事务: TransactionScope transaction = new TransactionScope(System.Transactions.Transa

在我的ASP.NET MVC5 Identity 2应用程序中,尝试使用事务,但它不工作。请参阅下面的代码,说明事务不工作。如果
var saveteacher=\u teacherService.Create(aTeacher)未成功插入,则AspNetUsers无法从数据库回滚

代码:


我认为问题可能出在异步方面

尝试按如下方式创建事务:

TransactionScope transaction = new TransactionScope(System.Transactions.TransactionScopeAsyncFlowOption.Enabled);
(您必须向引用中添加
System.Transactions


要提交事务,请转到
transaction.Complete()
回滚执行
transaction.Dispose()

问题在于,当您应该从HttpContext获取现有实例时,正在创建SchoolMSDbContext的新实例

例如:

using (var  dataContext = HttpContext.GetOwinContext().Get<ApplicationDbContext>())
    {
      //...
    }
使用(var dataContext=HttpContext.GetOwinContext().Get())
{
//...
}

确保
\u teacherService
UserManager
使用相同的数据库上下文。无需创建TransactionScope。

看起来合法。您是否在调试器中单步执行了代码?是否在出现错误时调用过
trans.Rollback()
?否:(但catch抛出异常ex{“一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。“”这是我为测试从何处抛出的吗?代码中有3个地方可以抛出此异常,它们都包装在
try catch
中,但您在catch中执行
Rollback
。是否未执行此回滚?无catch“Rollback”不执行任何操作!我在没有UserManager.CreateAsync的情况下测试它,并使用另一个模型,如clas我不知道为什么UserManager.CreateAsync(…)不起作用!太棒了!它起作用了!但我有一个问题:如果我删除了异步内容,那么我以前的代码仍然不起作用。为什么?不管怎样,我按照你说的更新了我的代码,现在它起作用了。谢谢:)默认情况下Identity是异步工作的。同步方法只是异步代码的包装。因此,如果您在上面添加事务,异步特性就会显现出来。感谢@trailmax,下面的语句非常有用“默认情况下,Identity在异步中工作。而同步方法只是异步代码的包装器。”transaction.dispose()用于回滚?不确定,如果这是正确的,因为您无论如何都必须处理事务!Complete方法提交事务。如果抛出异常,则不调用Complete,事务将回滚。@不,您不必显式调用
Dispose
。使用带有事务范围的
语句就足够了。请参见此处的代码示例:
using (var  dataContext = HttpContext.GetOwinContext().Get<ApplicationDbContext>())
    {
      //...
    }