在.Net Entity Framework中回滚事务

时间:2016-10-06 13:28:43

标签: c# sql-server database entity-framework

我有一个MVC Action Controller方法:

public ActionResult Register(ViewModel.User model)
    {
        DbContextTransaction dbTransaction = null;
        if (ModelState.IsValid)
        {
            try
            {
                UserAccountLogic registerUser = new UserAccountLogic();

                dbTransaction = registerUser.RegisterUser(model);
                Mail.SendEmail(model.Email, model.FirstName);

                dbTransaction.Commit();
                //Session["Email"] = model.Email;
                ViewBag.Style = "block";
            }
            catch (Exception e)
            {
                dbTransaction.Rollback();
                log.Error(e.Message, e);
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

RegisteredUser函数在Business Layer中:

public DbContextTransaction RegisterUser(User model)
    {
        //var userEntity = Mapper.Map<User, Dal.UserInfo>(model);
        var userEntity = MapModelToEntity(model);
        var registerService = new Dal.AccountService();

        return registerService.SaveRegisterDetails(userEntity);
    }

和SaveRegisterDetails函数在DataAccessLayer中为:

public DbContextTransaction SaveRegisterDetails(UserInfo registerDetails)
    {
        //TransactionModel transactionModel = new TransactionModel();

        using (HealthCarePortalEntities context = new HealthCarePortalEntities())
        {

            using (DbContextTransaction dbTran = context.Database.BeginTransaction())
            {
                context.UserInfo.Add(registerDetails);
                context.SaveChanges();

                return dbTran;
            }
        }

现在我的问题是,当向用户发送激活链接时发生任何异常时,我想回滚一个事务,即从数据库中新注册的用户数据。但问题是我正在执行回滚异常抛出的部分,因为数据库连接为空。 所以我的问题是如何在另一层的Controller中获得DAL层的连接。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您只需要实施IDisposable

private void Dispose(bool disposing)
{
    // ...
    if (disposing && (this._innerConnection != null))
    {
        this._disposing = true;
        this.Rollback(); // there you go
    }
}

Implement IDisposable

答案 1 :(得分:0)

您可以使用环境交易模型。

using(TransactionScope tran = new TransactionScope()) {
     UserAccountLogic registerUser = new UserAccountLogic();

     dbTransaction = registerUser.RegisterUser(model);
     Mail.SendEmail(model.Email, model.FirstName);
     tran.Complete();
}

这样,如果在事务范围内发生异常,db将回滚数据。