如何在基于MVC4/EF 6+的应用中实现事务

How to implement transactions in an application based on MVC4 / EF 6+

我刚刚读到 TransactionScope。非常好,内容丰富。

首先,我想知道我是否真的需要 MVC 4/EF 6+ 中的事务。原因是我们总是调用 DbContext.SaveChanges() 来保存更改。我想知道 SaveChanges() 是否模拟事务关闭意味着如果我调用 SaveChanges() 我提交事务。

另一方面,如果我需要事务,那么如何在 MVC/EF 应用程序中实现 TransactionScope。我的场景类似于以下步骤:

我也提供了代码。如您所见,如果中间出现问题,我会得到不一致的数据。如果能提供一些有关如何使用 TransactionScope 的示例,我将不胜感激。我可能还需要更多来保存在其他 table 中。我想确定要么保存所有内容,要么什么都不保存,以便在事务正常时保存所有内容,或者回滚问题发生的任何内容。

谢谢。

[HttpPost]
public ActionResult Edit(ApplicationViewModel viewmodel)
{
    using(MyDbCOntext dbContext = new MyDbContext())
    {
        if(!MoselState.IsValid)
            return View(application);

        // Copy old data from database and assign to an object
        ApplicationArchive applicationOld = CopyApplicationFromDB(db, viewmodel.ApplicationID);

        // Update model
        if (TryUpdateModel(applicationNew), null, null, new string[] { "ApplicationID" })
        {
            try
            {
                dbContext.Entry(userToUpdate).State = EntityState.Modified;
                dbContext.SaveChanges();

                // Archive old application
                ApplicationArchive applicationNew = CopyApplicationFromDB(db, viewmodel.ApplicationID);
                try
                {
                    dbContext.ApplicationsArchive.Add(applicationOld);
                    dbCOntext.ApplicationsArchive.Add(applicationNew);
                    dbContext.SaveChanges();

                    // Register user activity
                    string username = GetUserNameFromCookie();
                    UserActivity useractivity = new UserActivity() { UserName = username, activity = "edit", Table = "application" };
                    try
                    {
                        dbContext.UserActivities.Add(useractivity);
                        dbContext.SaveChanges();

                        return RedirectView("Index");
                    }
                }
            }
            catch
            {
                ModelState.AddModelError("", "Cannot update this application");
            }
        }


        //

        return View(application);
    }
}

您需要将数据库操作包装在 DbContextTransaction 中。有关 Entity Framework 个交易示例,请参阅此 link: https://msdn.microsoft.com/en-us/data/dn456843.aspx