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

标签 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);
    }
}

最佳答案

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

关于c# - 如何在基于MVC4/EF 6+的应用中实现事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28301938/

相关文章:

c# - 引用2个坐标并检查差异值

c# - ASP.NET MVC 应用程序在 Ajax 请求上使用 Kendo Chart 和大数据源?

entity-framework - 从 EF 中的 EntityType 获取 EntitySet 名称

c# - Entity Framework 和工厂模式

asp.net - 在 Application_BeginRequest 中设置 session 变量

c# - Entity Framework 存储过程不可用

c# - 在 Teams 机器人中发送打字事件失败 - BadGateway

c# - Sybase (SAP) ASE Ado.Net 16384 个字符的限制?

asp.net-mvc - MVC5登录到自定义数据库

javascript - 可以从文件上传输入获取文件 data/val 并使用 Ajax 请求将其发送到服务器