Использование 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");
}

Два вопроса:

  1. Метод Find() возвращает прокси, а не POCO, который заставляет Automapper жаловаться. Как получить POCO вместо прокси?
  2. Является ли это лучшей практикой для выполнения обновления?

Ответ 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:

  1. Отключите ObjectContext.ContextOptions.ProxyCreationEnabled, либо для всего приложения (в конструкторе EF Context или EDMX), либо для запроса, в котором вам нужно гарантировать получение реального объекта Entity, а не прокси.
  2. Использование расширения для Automapper описано здесь: https://gist.github.com/935461.

Запись. Последнее прокомментировано как "Возможности для улучшения. См.: Automapper: проблема с отображением при наследовании и абстрактный базовый класс для коллекций с Pocos Pocos Entity Framework 4".