Asp.net-Mvc-3

帶有 EF 4.1 和 EntityState.Modified 的 MVC3

  • March 27, 2015

使用 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;但這會告訴實體框架整個記錄已更新。

我通常會執行以下操作:

  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);
   }

引用自:https://stackoverflow.com/questions/8393532