Перезагрузка () не обновляет объект EF - PullRequest
3 голосов
/ 03 июля 2011

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

1 Ответ

0 голосов
/ 04 июля 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...