Может ли AutoMapper сопоставлять объект с свойством модели того же типа

#asp.net-mvc-3 #automapper

#asp.net-mvc-3 #automapper

Вопрос:

Я пытаюсь улучшить поток данных между моей моделью MVC 3 и представлениями (в основном CRUD). Я выбрал подход с использованием ViewModels и FormModels. Моя ViewModel содержит все, что нужно для представления представления FormData, выпадающих списков и т. Д. FormModel просто содержит поля FormData, которые отправляются формой и необходимы для обновления записи.

Мой вопрос в том, могу ли я использовать AutoMapper для сопоставления информации UserDTO с моим полем FormData в моей ViewModel?

Очевидно, что мое приведенное ниже сопоставление — это только сопоставление между двумя объектами, а не объект к свойству, но я попытался использовать параметры сопоставления ‘.ForMember’, но они снова для членов объекта, а не объекта для члена объекта. Я также посмотрел на пользовательские преобразователи типов, но не уверен, что это правильный путь.

 Mapper.CreateMap<UserDto, UserViewModel>();
Mapper.CreateMap<UserViewModel, UserDto>();

public class UserViewModel
{
    public User FormData { get; set; }

    // DropDownLists

    // Other view specific data

}

public class UserFormModel
{
    public int UserId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Age { get; set; }

    [Required]
    public string Email { get; set; }
}
  

Любая помощь будет высоко оценена.

Комментарии:

1. У вас есть какая-либо ошибка? В чем именно проблема?

2. Когда я проверяю, что конфигурация AutoMapper действительна с помощью Mapper. AssertConfigurationIsValid(); он сообщает мне, что поле FormData не сопоставлено, и мне нужно добавить пользовательское выражение сопоставления, игнорировать или переименовать свойство, которое я знаю. Мне просто нужно понять, как я делаю сопоставление, если это вообще возможно. Если нет, то просто вручную сопоставить?

3. Да, для каждого типа вам нужно установить сопоставление.

Ответ №1:

Вам нужно создать сопоставление с типом свойства FormData, а затем указать AutoMapper использовать эту карту.

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

 Mapper.CreateMap<UserDto, User>(); // set up property mapping

Mapper.CreateMap<UserDto, UserViewModel>()
.ForMember(vm => vm.FormData, map => map.MapFrom(dto => Mapper.Map<UserDto, User>(dto)));
  

Комментарии:

1. Большое спасибо за ваш ответ, но он все еще не работает. Все еще говорю, что ни одно из свойств не сопоставлено и что мне нужно выполнить пользовательское сопоставление. Потратил слишком много времени на это сейчас, так что можете просто сделать это вручную в любом случае!

2. На самом деле вернулся к нему и заставил его работать с точным предоставленным кодом. Единственной опечаткой было то, что я использовал. ForMember и нет . ForProperty. Большое спасибо.