代码之家  ›  专栏  ›  技术社区  ›  Nazmul Hossain

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

  •  7
  • Nazmul Hossain  · 技术社区  · 10 年前

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

    代码:

    using (var  dataContext = new SchoolMSDbContext())
    {
      using (var trans = dataContext.Database.BeginTransaction(IsolationLevel.ReadCommitted))
      {
        try
        {
          var adminresult =await UserManager.CreateAsync(user, teacherViewModel.Password);
          if (adminresult.Succeeded)
          {
            aTeacher.Id = user.Id;
            var saveteacher = _teacherService.Create(aTeacher);
          }
          else
          {
            trans.Rollback();
            ModelState.AddModelError("", adminresult.Errors.First());
            return View();
          }
          trans.Commit();
        }
        catch (Exception ex)
        {
          trans.Rollback();
          Console.WriteLine(ex.InnerException);
        }
      }
    }
    
    3 回复  |  直到 10 年前
        1
  •  7
  •   trailmax    10 年前

    我认为问题可能出在异步的东西上。

    尝试如下创建事务:

    TransactionScope transaction = new TransactionScope(System.Transactions.TransactionScopeAsyncFlowOption.Enabled);
    

    (您必须添加 System.Transactions )参考文献。

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

        2
  •  1
  •   Douglas Gandini    10 年前

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

    例子:

    using (var  dataContext = HttpContext.GetOwinContext().Get<ApplicationDbContext>())
        {
          //...
        }
    
        3
  •  0
  •   Dasun    10 年前

    确保 _teacherService UserManager 使用相同的DB上下文。无需创建TransactionScope。