实体框架和MVC中的乐观并发模型

Hen*_*gyi 6 c# asp.net-mvc concurrency entity-framework

我在ASP.NET MVC控制器中有以下更新代码:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Person(int id, FormCollection form)
{
  var ctx = new DB_Entities(); // ObjectContext
  var person = ctx.Persons.Where(s => s.Id == id).FirstOrDefault(); 
  TryUpdateModel(person, form.ToValueProvider()); 
  ctx.SaveChanges(); 
  return RedirectToAction("Person", id);
}
Run Code Online (Sandbox Code Playgroud)

但是,此更新代码是Last-Writer-Wins.现在我想添加一些并发控制.Person表已经有SQL时间戳列.我是否必须将时间戳值作为隐藏值发送给客户端并在回发中手动处理?或者,实体框架中是否有标准模式来执行此操作?

谢谢.

Cra*_*ntz 2

这实际上比应有的要困难一些。正如 Morteza 所说,除了将并发模式更改为固定之外,您还必须在 POST 期间更新实体之前注入在 GET 期间读取的并发值。考虑这个问题的方法是,在更新实体之前,您尝试将实体恢复到 GET 期间所处的状态。我在这个答案中有一个代码示例:

ASP.NET MVC 编辑操作中与 RowVersion 的并发