MVC3与EF 4.1和EntityState.Modified

Ben*_*enk 7 entity-framework-4 asp.net-mvc-3

使用MVC3更新对象

我有一个可以修改的模型,请看下面的示例:

[HttpPost]
public ActionResult Edit(Company c)
{
       if (ModelState.IsValid)
       {
           db.Entry(c).State = EntityState.Modified;
           db.SaveChanges();
           return RedirectToAction("Index");
       }
       return View(c);
}
Run Code Online (Sandbox Code Playgroud)

该模型具有未在视图中显示的其他字段,并且无法由用户修改,但是当我单击提交按钮时,未在视图中显示的字段设置为null.

我可以以某种方式让EF知道不修改某些字段吗?谢谢.

Mar*_*oth 12

通常最好不要直接绑定到实体对象,而是创建一个编辑模型并绑定到该模型.

毕竟......什么是阻止有人回复你不希望用这种方法改变的值?

这里的主要问题是mvc模型绑定在上下文之前更改模型中的属性,因此实体框架不知道哪些值已更改(因此应更新哪些值)

您已略微缓解了这一点,db.Entry(c).State = EntityState.Modified;但它告诉实体框架整个记录已更新.

我通常会做以下事情:

  1. 首先绑定到专门用于此控制器的模型
  2. 创建要更新的实体类的实例,相应地设置Id并将其附加到上下文
  3. 将实体上的属性更新为与绑定到的模型相同(对象已附加,因此实体框架正在跟踪现在要更改的列)
  4. 保存更改

第3步有点乏味,因此考虑使用像automapper这样的工具来简化操作

编辑:

    [HttpPost]
    public ActionResult Edit(Company c)
    {
        if (ModelState.IsValid)
        {
            Company dbCompayObjct = new Company { companyId = c.companyId };
            db.Company.Attach(dbCompayObjct);

            dbCompanyObjct.CompanyName = c.CompanyName;
            dbCompanyObjct.City = c.City;

            db.SaveChanges();

            return RedirectToAction("Index");
        } 
        return View(c);
    }
Run Code Online (Sandbox Code Playgroud)