C# 如何在基于MVC4/EF 6+的应用程序中实现事务;
我刚刚读到了一篇关于。这本书很好,内容丰富 首先,我想知道我是否真的需要MVC4/EF6+中的事务。原因是我们总是调用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。我的场景类似于以下步骤: 我将有效记录保存在数据库中 我将旧记录和新记录的副本保存在另一个表中,该表是原始表的归
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感谢链接。我现在要通读一遍,谢谢格雷格的链接,尽管它和马丁之前提供的完全一样。