我正在从一本书中使用 C# 中的 EF 开发一个 ASP.NET MVC 项目,这部分是为了避免从不同的会话同时更新一个实体。这本书很棒,但不幸的是,这部分的解释不够充分,如果有人能帮助我理解,我将不胜感激。我会尽量省略不相关的代码。该模型基本上只有一个属性“名称”,因此非常简单:
[HttpPost]
public ActionResult Edit(int? id, byte[] rowVersion)
{
string[] fieldsToBind = new string[] { "Name", "RowVersion" };
var categoryToUpdate = db.Categories.Find(id);
if (TryUpdateModel(categoryToUpdate, fieldsToBind))
{
try
{
db.Entry(categoryToUpdate).OriginalValues["RowVersion"] =
rowVersion;
db.SaveChanges();
return RedirectToAction("Index");
}
catch (DbUpdateConcurrencyException ex)
{//... and the code goes on to handle the concurrent update
// scenario
}
这是我不明白的:如果 TryUpdateModel 方法成功更新了模型,并绑定了新值“Name”和“RowVersion”(由视图提供),为什么我必须包含这一行:db.Entry (categoryToUpdate).OriginalValues["RowVersion"] = rowVersion;? 这条线到底是做什么的?为什么需要抛出异常?谢谢