@primat1987
люблю кодить на C#, есть блог sharp-blog.ru

Как правильно действовать в следующей ситуации?

Добрый день. Опишу кратко в чем проблема.
Приложение на Asp.Net MVC 4 + EF. Допустим есть доменная модель
class Model 
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }

        public string UserName { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
}


и есть модель представления ViewModel. В ней всё то же самое что и в доменной модели, только нет к примеру свойства PhoneNumber.
Нужно отобразить форму с ViewModel, отредактировать ее и изменения внести в БД.
Как я делаю.
1) беру из БД Model. AutoMapper перевожу в ViewModel и эту модель контроллер отправляет в представление.
2) Редактирую какие-то поля. submit и нужно сохранить изменения. Но во ViewModel нет PhoneNumber. Т.е. мне надо вытащить из БД Model, скопировать все поля из ViewModel в Мodel (кроме Id, PhoneNumber). Записать в БД.
Вопрос. А если в Model и ViewModel очень много полей, вручную что ли писать метод копирования из ViewModel в Model?? Или можно как-то AutoMapper воспользоваться? Как вообще правильно обрабатывать такой сценарий?
  • Вопрос задан
  • 554 просмотра
Пригласить эксперта
Ответы на вопрос 2
@ximility
Developer c#
в AutoMapper'е можно задать правила маппинга из model во viewmodel и обратно.
первое попавшееся на хабре:
habrahabr.ru/post/71820
кастомная конфигурация как выражается автор...
а вообще, когда я не знал о существовании AutoMapper в ручную каждое поле перегонял из ViewModel в DbModel,
и я уверен в большинство случаев в ручную и придется перегонять , AutoMapper не всегда сможет выручать...хотя может я и не прав, так как заядлым любителем последнего не являюсь.
Ответ написан
@primat1987 Автор вопроса
люблю кодить на C#, есть блог sharp-blog.ru
Сам разобрался. Зря наверное вопрос создавал. В AutoMapper есть перегруженный метод, который отображает исходный объект на существующий объект. Т.е. все поля из ViewModel отобразятся на Model, а "лишние" поля Model останутся без изменений.

//...
Model fromDb = GetModelFromDbById(id);
Model model = Mapper.Map<ViewModel, Model>(viewModel,  fromDb);


Если вдруг данные способ не во всех случаях подойдет или можно как-то получше сделать, пишите свои ответы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы