如何使用TryUpdateModel

时间:2015-03-06 17:45:28

标签: c# asp.net entity-framework asp.net-mvc-4

我正在准备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;

当我删除此行时,代码仍然可以正常运行并且更新完成。 有人可以帮我解决这个问题吗?如果是这样,为什么当我删除它时,更新效果很好。

2 个答案:

答案 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自动更改跟踪的情况,它看起来效果很好。

有关详情,请参阅How change tracking works in Entity Framework