Метод TryUpdateModel
может использоваться для присвоения значений объекту, используя сопоставление между его именами свойств и значениями, указанными в веб-запросе.При этом, вы можете достичь того же поведения, выполнив что-то вроде этого:
[HttpPost]
public ActionResult Edit(int id, FormCollection form)
{
Car entity = new Car { Id = id };
// This will attach the car entity to the content in the unchanged state.
this.EntityFrameworkObjectContext.Cars.Attach(car);
TryUpdateModel(entity, form.ValueProvider.ToXYZ()); // Can't remember the exact method signature right now
this.EntityFrameworkObjectContext.SaveChanges();
...
}
При присоединении сущности к контексту вы просто уведомляете контекст, что у вас есть сущность, которую он должензаботиться о.Как только объект присоединен, контекст будет отслеживать изменения, внесенные в него.
Но этот метод подходит только для скалярных свойств, поскольку свойства навигации не обновляются с помощью этого метода.Если у вас включены свойства внешнего ключа (например, продукт, назначенный категории, также имеет свойство CategoryId, которое связывает их), вы все равно сможете использовать этот метод (поскольку свойство навигации отображается с помощью скалярного свойства).
Редактировать: Другой способ - принять экземпляр Car в качестве параметра:
[HttpPost]
public ActionResult Edit(int id, Car car)
{
Car entity = new Car { Id = id };
// This will attach the car entity to the content in the unchanged state.
this.EntityFrameworkObjectContext.Cars.Attach(entity);
// It is important that the Car instance provided in the car parameter has the
// the correct ID set. Since the ApplyCurrentValues will look for any Car in the
// context that has the specified primary key of the entity supplied to the ApplyCurrentValues
// method and apply it's values to those entity instance with the same ID (this
// includes the previously attached entity).
this.EntityFrameworkObjectContext.Cars.ApplyCurrentValues(car);
this.EntityFrameworkObjectContext.SaveChanges();
...
}
Вы также можете свернуть свой собственный ModelBinder, который на самом деле имеет ссылку на контекст Entity Framework и смотрит, является ли Car.Id был указан в форме / запросе.Если идентификатор присутствует, вы можете получить объект для обновления непосредственно из контекста.Этот метод требует некоторых усилий, так как вы должны убедиться, что вы сначала ищете ID, а затем применяете все указанные значения свойств.Если вам интересно, я могу дать вам пример для этого.