如何使用 TryUpdateModel

How to use TryUpdateModel

我正在准备this tutorial。我从本教程中看到作者使用以下代码进行更新:

....
var studentToUpdate = db.Students.Find(id);
if (TryUpdateModel(studentToUpdate, "",
   new string[] { "LastName", "FirstMidName", "EnrollmentDate" }))
{
    try
    {
        db.Entry(studentToUpdate).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("Index");
    }
   ...
}

但我不明白为什么需要下面一行:

db.Entry(studentToUpdate).State = EntityState.Modified;

当我删除这一行时,代码仍然运行良好并且更新完美完成。 有人可以帮我确定是否需要这条线吗?如果是这样,为什么当我删除它时,更新工作正常。

该行明确告诉 EF 上下文实体已被修改,需要在下次调用 SaveChanges() 时更新。当您删除该行时一切仍然有效的原因是上下文通常会自动为您跟踪这些更改。我还没有遇到需要 fiddle 在生产中使用 EF 的自动更改跟踪的情况,它似乎运行良好。

有关更多信息,请参阅 How change tracking works in Entity Framework

它运行良好,因为您从上下文中找到了 studentToUpdate,这就是附加实体的方式,并且在您调用 [=13] 时保存由 TryUpdateModel 方法所做的更改=] 方法。

如果您使用的是分离的实体,例如这样做:

var studentToUpdate=new Student(){Id=id};
if (TryUpdateModel(studentToUpdate, "",
   new string[] { "LastName", "FirstMidName", "EnrollmentDate" }))
{
    try
    {
        db.Entry(studentToUpdate).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("Index");
    }
...
}

在这种情况下,您必须调用 Entry 方法将实体附加到您的上下文并更改其状态。