Мне нравится практика .NET MVC получения экземпляра модели класса, переданной контроллеру, который уже заполнил некоторые из своих свойств из опубликованных значений формы.очень удобно.
[HttpPost]
public ActionResult DoTask(MyModel model)
модель поступает со своим идентификатором и другими свойствами, установленными из опубликованных данных формы.однако предположим, что я хочу сохранить модель, а затем получить доступ к дополнительным свойствам, которые существуют только в базе данных.Мне нужно перезагрузить модель в этот момент.
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
db.Entry(model).Reload();
//model.relatedModel is empty, as are all other model fields not set by the post
Я бы ожидал, что это полностью перезагрузит модель из базы данных на основе ее идентификатора.но это не происходит для меня.свойства модели не загружаются из базы данных.они все еще пусты.
РЕДАКТИРОВАТЬ
Я не понимаю, почему db.Entry(model).Reload();
терпит неудачу для меня.но дальнейшее чтение начинает предполагать, что я должен избавиться от dbcontext после выполнения сохранения и перезагрузки модели.Это правда?
РЕДАКТИРОВАТЬ
WHOOPS!У меня все неправильно.теперь я вижу, что когда я фиксирую изменения db.SaveChanges()
, я фактически перезаписываю всю модель, а не только свойства, которые были установлены контроллером MVC.у меня должен быть неправильный образец.Как я могу применить новые значения (переданные в мой контроллер) к моей базе данных без перезаписи неизмененных свойств?это превращается в очень сомнительный вопрос, я думаю.
ЗАКЛЮЧЕНИЕ
Как оказалось, Reload () обновляется, как и ожидалось.Моя проблема заключалась в том, что я перезаписывал свою строку базы данных, когда я вызывал SaveChanges для моего dbcontext, используя модель, которая автоматически создавалась контекстом контроллера и передавалась в качестве параметра моему методу контроллера.в этом случае он перезаписал как назначенные свойства, так и неназначенные.
Сейчас я делаю select
model = db.Models.Single(x => x.ID == modelID);
, а затем обновляю его с помощью UpdateModel (вызов с префиксом, чтобы он работал)
UpdateModel(model, "myPrefix");
db.SaveChanges();