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

时间:2015-02-03 14:57:15

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 transactions

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

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

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

  • 我在数据库中保存有效记录
  • 我将旧记录和新记录的副本保存在另一个表中,这是原始表的归档版本
  • 我将用户的活动保存在另一个表格中

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

感谢。

[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);
    }
}

1 个答案:

答案 0 :(得分:3)

您需要在DbContextTransaction中包装数据库操作。请参阅此链接以获取Entity Framework事务示例:     https://msdn.microsoft.com/en-us/data/dn456843.aspx