如何在ASP.NET MVC identity 2中使用事务?
在我的ASP.NET MVC5 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
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>())
{
//...
}