Мне нравится практика .NET MVC по получению экземплярной модели класса, переданной контроллеру, который уже имеет некоторые свои свойства, заполненные из опубликованных значений формы. очень удобно.Reload() не обновляет объект EF
[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
Я бы ожидал, что это полностью загрузит модель из базы данных на основе ее идентификатора. но это не для меня. свойства модели не загружаются из базы данных. они все еще пусты.
EDIT
я не понимаю, почему db.Entry(model).Reload();
терпит неудачу для меня. но дальнейшее чтение начинает предполагать, что я должен избавиться от dbcontext после выполнения сохранения и затем перезагрузки модели. Это правда?
EDIT
WHOOPS! у меня все неправильно. Теперь я вижу, что когда я фиксирую изменения db.SaveChanges()
, я фактически переписываю всю модель, а не только свойства, заданные контроллером MVC. у меня должен быть неправильный шаблон. как применить новые значения (переданные в мой контроллер) к моей базе данных без перезаписывания немодифицированных свойств? Думаю, это превращается в очень нужный вопрос.
ЗАКЛЮЧЕНИЕ
, как оказалось, Reload() ДЕЛАЕТ обновления, как ожидалось. моя проблема заключалась в том, что я перезаписывал свою строку db, когда я вызывал SaveChanges в моем dbcontext, используя модель, которая была автоматически создана в контексте контроллера и передана в качестве параметра для моего метода контроллера. в этом случае он переписывал как назначенные свойства, так и неназначенные.
я сейчас делаю отборный
model = db.Models.Single(x => x.ID == modelID);
, а затем обновить его с помощью UpdateModel (вызов с префиксом, чтобы заставить его работать)
UpdateModel(model, "myPrefix");
db.SaveChanges();
Возможный дубликат [Entity Framework: Игнорировать столбцы] (http://stackoverflow.com/questions/737520/entity-framework-ignore-columns) – bzlm