我刚读过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);
}
}
答案 0 :(得分:3)
您需要在DbContextTransaction中包装数据库操作。请参阅此链接以获取Entity Framework事务示例: https://msdn.microsoft.com/en-us/data/dn456843.aspx