我正在准备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;
当我删除此行时,代码仍然可以正常运行并且更新完成。 有人可以帮我解决这个问题吗?如果是这样,为什么当我删除它时,更新效果很好。
答案 0 :(得分:1)
它很有效,因为您从上下文中找到了studentToUpdate
,这是实体附加的方式,当您调用{TryUpdateModel
方法时,SaveChanges
方法所做的更改会被保存{1}}方法。
如果您正在使用分离的实体,例如这样做:
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
方法将实体附加到您的上下文并更改其状态。
答案 1 :(得分:0)
该行明确告知EF上下文实体已被修改,并且需要在下次调用SaveChanges()
时进行更新。删除该行时一切仍然有效的原因是上下文通常会自动跟踪这些更改。我还没有遇到过需要在生产中使用EF自动更改跟踪的情况,它看起来效果很好。