簡體   English   中英

在.Net實體框架中回滾事務

[英]Rollingback a transaction in .Net Entity Framework

我有一個MVC動作控制器方法,如下所示:

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函數在業務層中的位置為:

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層的連接。 謝謝您的幫助。

您只需要實現IDisposable

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

實施IDisposable

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

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

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

這樣,如果事務范圍內發生異常,則數據庫將回滾數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM