Asp.net-Mvc-3
帶有 EF 4.1 和 EntityState.Modified 的 MVC3
使用 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 並將其附加到上下文
- 將實體上的屬性更新為與您綁定的模型相同(對像已附加,因此實體框架正在跟踪哪些列現在正在更改)
- 保存更改
第 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); }