Проблема с операцией UPDATE в Entity Framework 4 (чистые POCO) - PullRequest
4 голосов
/ 26 октября 2010

У меня есть модель Entity Framework 4.0, реализованная с использованием чистого POCO (без генерации кода, без самопроверкаемых сущностей, просто из старых старых объектов CLR).

Теперь вот код, который у меня есть в моем UI длявыполнить ОБНОВЛЕНИЕ:

[HttpPost]
public ActionResult UpdatePerson(Person person)
{
    repository.Attach(person);
    unitOfWork.Commit();
}

По сути, у меня есть метод действия, который принимает строго типизированный объект Person, и мне нужно ОБНОВИТЬ эту сущность.

не ошибка, но также не сохраняет изменения в БД.: (*

Когда я проверяю EntityState во время "Подтверждения" моей единицы работы:

var entities = ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged);

Я вижу свою сущность с EntityState.Без изменений .

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

Я обнаружил, что некоторые потоки говорят, что мне нужно вручную установить состояние объекта:

ctx.ObjectStateManager.ChangeObjectState(person, EntityState.Modified);

Это правильно? Куда я поместил бы эту логику? Выставить в качестве операции на моем устройствеработы?

Очевидно, проблема в том, что у меня нет отслеживания изменений вообще, из-за использования Pure POCO (без создания EntityObject, без реализации INotifyPropertyChanging).

я не нашел проблемы с этим до сих пор.

Что я делаю не так?

1 Ответ

2 голосов
/ 26 октября 2010

Что ж, поскольку у вас нет отслеживания изменений и т. Д., У EF должен быть способ определить, что делать с присоединенным объектом при вызове SaveChanges().По умолчанию EntityState не изменяется, поэтому, если вы хотите обновить, вам нужно вручную установить состояние.

Другой способ - запросить Person с этим Id, переписать свойства с даннымивы получаете с контроллера и звоните SaveChanges().На самом деле это более безопасный способ, поскольку вы можете уберечь себя от ситуации, когда Person удаляется, пока пользователь редактирует веб-форму;но это, очевидно, требует дополнительной передачи туда и обратно в БД, которая часто менее желательна.

В любом случае, у меня был бы метод хранилища Update() (более конкретный, чем Attach), который фактически прикреплял быи измените значение EntityState на Modified.И в вашем действии все еще есть относительно чистый код:

public ActionResult UpdatePerson(Person person)
{
    repository.Update(person);
    unitOfWork.Commit();
}
...