2011-07-03 3 views
3

Мне нравится практика .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(); 
+0

Возможный дубликат [Entity Framework: Игнорировать столбцы] (http://stackoverflow.com/questions/737520/entity-framework-ignore-columns) – bzlm

ответ

0

Если вам нужно обновить только выбранные свойства, которые вы должны сделайте это вручную:

db.YourEntitySet.Attach(model); 
db.Entry(model).Property(m => m.SomeProperty).IsModifed = true; 
// other properties here 
db.SaveChanges(); 

После этого ваша перезагрузка будет работать, но поскольку вы хотите повторно aload модель в любом случае вы можете сделать это просто:

var dbModel = db.YourEntitySet.Single(m => m.Id == model.Id); 
dbModel.SomeProperty = model.SomeProperty; 
// other properties here 
db.SaveChanges(); 

и вы dbModel как «перезагружается» один. Вы не можете использовать какой-либо аутоматический подход, например UpdateModel, или применять текущие значения, поскольку он всегда переопределяет все, включая значения, которые не были установлены вашим клиентом. EF не знает, что является действительным изменением.

+0

спасибо. это полезно. одно дополнение: похоже, что я могу использовать UpdateModel для выборочного обновления только тех свойств, которые были изменены (были отправлены в форме публикации).когда я вызываю UpdateModel, я вижу, что только обновленные свойства имеют свойство IsModified равное true. – Paul

Смежные вопросы