2016-10-15 3 views
1

Есть ли способ использовать Automapper 5.1.1 для обновления существующего объекта, а не создания нового.Automapper для обновления существующего объекта в отличие от создания нового

Например, у нас есть объект Customer и CustomerViewModel. Мы хотели бы обновить существующее значение Customer с помощью значений полей CustomerViewModel.

Большое спасибо за вашу помощь.

ответ

1

Не рекомендуется использовать Automapper для сопоставления модели с вашим объектом. Зависимости или информация могут быть перезаписаны, если они не используются с умом. Но использовать его, как вы хотите, вам нужно только, чтобы создать карту из вашей модели в вашей Сущности, а затем вызвать

Mapper.Map(myModel, myEntity); 

отображение к сущности проблемы

Я предполагаю, что вы используете ORM, как NHibernate или EF, то ваши Entites - это Proxies, где ссылки также являются прокси-серверами и так далее. Теперь представьте себе, что у вас есть проект ASP.NET MVC и вы привязываете свой Entity к своей ViewModel. Вы показываете свою модель в своем представлении как форме, но вы показываете только те свойства, которые вам нужны в вашем представлении, а не все, что задано в вашей модели ViewModel. Затем пользователь отправляет форму обратно вам, и ваш контроллер получает ViewModel обратно, но на этот раз не все свойства установлены, потому что ваш вид только знал те, которые были показаны. Если вы переместите свой ViewModel обратно в свою сущность, все униализированные свойства находятся в состоянии по умолчанию и будут перезаписывать действительные данные для вашего объекта.

Другая проблема заключается в том, что AutoMapper использует Reflections для установки свойств. Обычно право на существование для ORM - это возможность легко реализовать DomainLayer. У DomainLayer есть некоторые Validations, Calculation ... на самом Entity. Если теперь Свойства, заданные с Reflection, он будет игнорировать логику Business, и не будет выполнено Validation, Calculations .....

Так что мой совет: не сопоставлять с объектами;)

+0

Спасибо за ваш ответ. Вы упомянули, что будьте осторожны в отношении зависимостей/информации. Что может быть потеряно? Все, что мы хотим сделать, это скопировать значения полей из одного в другое. Еще раз спасибо. – user2981411

+0

Рад, что я мог помочь;) Я отредактировал свой ответ, чтобы принести немного больше света. – Rabban

+0

Спасибо за понимание. Первая проблема именно в том, почему я хочу использовать ViewModel, так что и инициализирован, и неинициализирован - то есть независимо от того, какой вид ViewModel должен быть передан Entity, но ничего другого. Вторая проблема заключается в том, что если вы примените свою логику проверки и аннотации данных и т. Д. К ViewModel, вы получите такое же поведение, как если бы оно было применено к Entity. Infact мы применили интерфейс IValidatableObject и аннотации данных к модели View, которая работает. – user2981411

Смежные вопросы