gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com