Как можно легко обновлять сущности?(EF Code First, MVC3) - PullRequest
0 голосов
/ 15 января 2012

Я думал, что все это выяснил, но я бью кирпичную стену.

Клиент отправляет объект, мой контроллер проверяет, есть ли у пользователя право на редактирование, затем продолжает обновлять объект вбаза данных.(вместе с любым навигационным свойством объекта).
Моя проблема в том, что я не могу заставить его работать ...

Я пытался

var obj = context.Recipes.SingleOrDefault(o=>o.ID == id);
UpdateModel(obj);

Но я получил исключение «модель не может быть обновлена».
Поэтому я попробовал другой подход, поместив Recipe r в список параметров (и пусть связыватель модели сделает всю работу) и вызвав

context.Recipes.Attach(r); 

но это оставляет вещи без изменений, поэтому context.SaveChanges() ничего не делает.

Есть ли простое решение без необходимости писать obj.SomeProperty = r.SomeProperty для КАЖДОГО свойства моего объекта?

Бонусный вопрос: если у моей сущности есть навигационное свойство (коллекция), я, очевидно, добавляю новые отправленные (с ID == 0), но как узнать, какую из них удалить?Могу ли я использовать отслеживание изменений EF где-нибудь здесь?

Для обоих вопросов: должен ли быть магический метод «сравнить этот объект с этим объектом, а затем сохранить»?

Ответы [ 3 ]

3 голосов
/ 15 января 2012

Ответ на ваш вопрос очень непопулярен.EF не поддерживает это.EF может синхронизировать только состояние простого объекта без свойств навигации.Как только вам нужно синхронизировать изменения в отношениях, такие как добавленная или удаленная связанная сущность, вы должны сделать это полностью вручную - особенно для удаления требуется это, или вы должны установить удаленные связи в отдельной коллекции от клиента и реплицировать удаление на присоединенную сущность, котораядовольно громоздко.

В качестве обходного пути люди используют TryUpdateModel или UpdateModel из MVC, который выполняет изменения в свойствах навигации, но в таком случае вы не можете предъявлять какие-либо другие требования к процедуре обновления.Простые старые значения будут перезаписаны новыми значениями, поступающими от вашего клиента.

Код EF сначала имеет эквивалент ApplyOriginalValues:

context.Entry(attachedEntity).OriginalValues.SetValues(detachedEntity);
2 голосов
/ 15 января 2012

По вопросу обработки обновлений свойств навигации см. Добавление назначений курса на страницу редактирования инструктора этого руководства:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

1 голос
/ 15 января 2012

Попробуйте использовать EntityState вместо модели обновления, как показано ниже, и посмотрите, поможет ли это

context.Entry(obj).State = EntityState.Modified;
db.SaveChanges();
...