Обновление БД с помощью Automapper / EF CodeFirst - PullRequest
3 голосов
/ 21 ноября 2011

Я использую Automapper в своем проекте MVC / EF Code First. При отображении ViewModel в View я использую класс конвертера клиента, унаследованный от TypeConverter. Я настраиваю отображение, используя следующий код:

Mapper.CreateMap<CustomerViewModel, Customer>().ConvertUsing<CustomerConverter>();

где CustomerConverter - это мой класс TypeConverter.

Это прекрасно работает при создании нового объекта Customer и сохранении в db

Customer customer = Mapper.Map<CustomerViewModel, Customer>(viewModel);
dbEntities.Customer.Add(customer);
dbEntities.SaveChanges();

Но при редактировании существующего клиента я обнаружил, что изменения в объекте клиента не сохраняются.

Код, который я использую для обработки существующих обновлений клиентов, выглядит следующим образом

var customer = dbEntities.Customer.Single(a => a.CustomerId == viewModel.CustomerId.Value);
Mapper.CreateMap<ExistingCustomerViewModel, Customer>().ForMember(dest => dest.CustomerId, opt => opt.Ignore()).ConvertUsing<ExistingCustomerConverter>();
Mapper.Map<ExistingCustomerViewModel, Customer>(viewModel, customer);
dbEntities.Entry(customer).State = EntityState.Modified;
dbEntities.SaveChanges();

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

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

т.е. 1018 *

Mapper.CreateMap<ExistingCustomerViewModel, Customer>().ForMember(dest => dest.CustomerId, opt => opt.Ignore()); 

работает правильно, но я теряю способность применять пользовательское сопоставление.

Я что-то упустил? Спасибо за помощь!

Спасибо! Bala

1 Ответ

1 голос
/ 22 ноября 2011

Я наконец решил изменить свой подход. Прочитав статью ниже http://lostechies.com/jimmybogard/2009/09/18/the-case-for-two-way-mapping-in-automapper/ Я решил использовать Automapper только для отображения сущности в viewmodel. Во время события HttpPost я вручную присваиваю атрибуты из модели представления сущности. Конечно, это делает мой код объемным, но он дает мне контроль над тем, что попадает в базу данных. Ура! Bala

...