Использование Automapper для обновления существующего объекта POCO
Я использую EF4 DbContext, чтобы предоставить модель для приложения ASP.NET MVC. Я использую ViewModels для предоставления данных в представлениях и Automapper для выполнения сопоставления между EOC POCOs и ViewModels. Automapper отлично справляется, но я не знаю, как лучше использовать его после того, как ViewModel отправляется обратно на контроллер для выполнения обновления.
Моя идея - получить объект POCO с помощью ключа, содержащегося в ViewModel. Затем я хочу использовать Automapper для обновления POCO с данными из ViewModel:
[HttpPost]
public ActionResult Edit(PatientView viewModel)
{
Patient patient = db.Patients.Find(viewModel.Id);
patient = Mapper.Map<ViewModel, Patient>(viewModel, patient);
...
db.SaveChanges();
return RedirectToAction("Index");
}
Два вопроса:
- Метод Find() возвращает прокси, а не POCO, который заставляет Automapper жаловаться. Как получить POCO вместо прокси?
- Является ли это лучшей практикой для выполнения обновления?
Ответы
Ответ 1
Если вы используете Automapper, то он возвращает новый объект Patient, а ссылки на график инфраструктуры enity не сохраняются. Вы должны использовать его так:
[HttpPost]
public ActionResult Edit(PatientView viewModel)
{
Patient patient = db.Patients.Find(viewModel.Id);
Mapper.Map(viewModel, patient);
...
db.SaveChanges();
return RedirectToAction("Index");
}
Ответ 2
Кажется, есть два подхода к решению проблемы с прокси EF:
- Отключите
ObjectContext.ContextOptions.ProxyCreationEnabled
, либо для всего приложения (в конструкторе EF Context или EDMX), либо для запроса, в котором вам нужно гарантировать получение реального объекта Entity, а не прокси.
- Использование расширения для Automapper описано здесь: https://gist.github.com/935461.
Запись. Последнее прокомментировано как "Возможности для улучшения. См.: Automapper: проблема с отображением при наследовании и абстрактный базовый класс для коллекций с Pocos Pocos Entity Framework 4".