Использование Automapper для обновления существующего объекта POCO

Я использую EF4 DbContext, чтобы предоставить модель для приложения ASP.NET MVC. Я использую ViewModels для предоставления данных представлениям и Automapper для выполнения сопоставления между EF POCO и 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. Это лучший способ выполнить обновление?

person Paul Taylor    schedule 09.11.2012    source источник


Ответы (2)


Если вы используете 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");
}
person Marius Stănescu    schedule 11.08.2014
comment
Да, я считаю, что ошибка была исправлена ​​с тех пор, как я опубликовал этот вопрос, и метод, который вы иллюстрируете, теперь работает правильно. - person Paul Taylor; 11.08.2014

Кажется, есть два подхода к решению проблемы прокси-сервера EF:

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

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

person Paul Taylor    schedule 12.11.2012