Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在基于MVC4/EF 6+的应用程序中实现事务;_C#_Asp.net Mvc_Entity Framework_Asp.net Mvc 4_Transactions - Fatal编程技术网

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

C# 如何在基于MVC4/EF 6+的应用程序中实现事务;,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,transactions,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Transactions,我刚刚读到了一篇关于。这本书很好,内容丰富 首先,我想知道我是否真的需要MVC4/EF6+中的事务。原因是我们总是调用DbContext.SaveChanges()来保存更改。我想知道SaveChanges()是否是模拟事务关闭的东西,这意味着如果我调用SaveChanges()提交事务 另一方面,如果我需要事务,那么如何在MVC/EF应用程序中实现TransactionScope。我的场景类似于以下步骤: 我将有效记录保存在数据库中 我将旧记录和新记录的副本保存在另一个表中,该表是原始表的归

我刚刚读到了一篇关于。这本书很好,内容丰富

首先,我想知道我是否真的需要MVC4/EF6+中的事务。原因是我们总是调用
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中。有关实体框架事务示例,请参见此链接:

不要将
事务
事务范围
混淆,它们是不能互换的。@Maarten我不知道我混淆了这两者。我认为
TransactionScope
会促进数据库事务。这就是我在这里使用这两个术语的原因。@danludwig感谢链接。我现在要通读一遍,谢谢格雷格的链接,尽管它和马丁之前提供的完全一样。