MVC3 с EF 4.1 и EntityState.Modified - PullRequest
       5

MVC3 с EF 4.1 и EntityState.Modified

7 голосов
/ 06 декабря 2011

Обновление объекта с помощью MVC3

У меня есть модель, которую я могу изменить, см. Образец ниже:

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

У модели есть другие поля, которые не отображаются на видеи не может быть изменен пользователем, но когда я нажимаю кнопку отправки, поля, которые не отображались в представлении, устанавливаются в нуль.

Могу ли я как-то сообщить EF, что не нужно изменять определенные поля?Спасибо.

Ответы [ 3 ]

12 голосов
/ 06 декабря 2011

Как правило, лучше не связываться напрямую с объектом-сущностью, а создать модель редактирования и привязаться к ней.

В конце концов ... что мешает кому-то публиковать обратные значения, которые вы не хотите изменять с помощьюэтот подход?

Основная проблема здесь заключается в том, что привязка модели mvc изменяет свойства в модели до ее изменения в контексте, поэтому структура сущности не знает, какие значения изменились (и, следовательно, какие следует обновить.)

Вы немного уменьшили это с помощью db.Entry(c).State = EntityState.Modified;, но это говорит платформе сущности, что вся запись обновлена.

Обычно я делал бы следующее:

  1. Привязка к модели специально для этого контроллера сначала
  2. Создайте экземпляр класса сущности, который вы хотите обновить, установите соответствующий Id и присоедините его к контексту
  3. Обновите свойства наобъект должен быть тем же, что и модель, к которой вы привязаны (объект прикреплен, и, следовательно, структура объекта отслеживает, какой объектсейчас меняется mns)
  4. 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);
    }
3 голосов
/ 06 декабря 2011

Вы явно перезаписываете существующую запись неполной записью. При использовании вышеописанного метода он полностью заменит существующий.

Вам либо необходимо заполнить все поля, которые вы не хотите заменять существующими значениями, либо вам нужно получить существующую запись и изменить поля, которые вы хотите изменить, а затем сохранить ее.

0 голосов
/ 27 марта 2015

Отражение не всегда зло, иногда это твой друг:

public ActionResult Edit(Company c)
{
   if (ModelState.IsValid)
   {
        Company UpdateC = db.Company.find(c.CompanyID);        
        foreach (var property in typeof(Company).GetProperties())
        {
            var propval = property.GetValue(c);
            if (propval != null)
            {
                property.SetValue(UpdateC, propval);
            }
        }

        db.SaveChanges();  
        return RedirectToAction("Index");
   }
   return View(c);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...