使用MVC3更新对象
我有一个可以修改的模型,请看下面的示例:
[HttpPost] public ActionResult Edit(Company c) { if (ModelState.IsValid) { db.Entry(c).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(c); }
该模型具有未在视图中显示的其他字段,并且不能由用户修改,但是当我单击提交按钮时,未在视图中显示的字段设置为null.
我可以以某种方式让EF知道不修改某些字段吗?谢谢.
解决方法
通常最好不要直接绑定到实体对象,而是创建一个编辑模型并绑定到该模型.
毕竟…什么是阻止有人发布回来的价值你不想用这种方法改变?
这里的主要问题是mvc模型绑定在上下文之前更改模型中的属性,因此实体框架不知道哪些值已更改(因此应更新哪些值)
您已经使用db.Entry(c)稍微减轻了这一点.State = EntityState.Modified;但这告诉实体框架整个记录已经更新.
我通常会做以下事情:
>首先绑定到专门用于此控制器的模型
>创建要更新的实体类的实例,相应地设置Id并将其附加到上下文
>将实体上的属性更新为与绑定到的模型相同(对象已附加,因此实体框架正在跟踪现在正在更改的列)
> SaveChanges
第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); }