我刚刚读到关于 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/