如何使用TryUpdateModel

我正在准备本教程 。 我从本教程中看到,对于更新,作者使用以下代码:

.... 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; 

当我删除这一行时,代码仍然运行良好,更新完美。 有人可以帮我解决这个问题吗? 如果是这样,为什么当我删除它时,更新运行良好。

它运行良好是因为您从上下文中找到studentToUpdate ,这是实体附加的方式,并且在调用SaveChanges方法时会保存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方法将实体附加到您的上下文并更改其状态。

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

有关详细信息,请参阅entity framework中的更改跟踪如何工作 。