Как использовать AutoMapper .ForMember?

88

Я пытаюсь настроить AutoMapper для преобразования из Entity в DTO. Я знаю, что должен использовать .ForMember()after Mapper.CreateMap<Entity, DTO>()для настройки пользовательских сопоставлений, но это не похоже на доступный метод.

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

Mapper.CreateMap<EFAddress, Address>()
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name));

Если у меня есть недопустимое имя типа в CreateMap <>, я вижу «ForMember» как допустимый метод, при наведении указателя мыши отображается подпись метода, как я обычно ожидал. Но как только я даю ему два допустимых типа, ForMember говорит, что не может разрешить символ, как будто метод недоступен.

Есть ли какие-то ограничения на общие классы, которые я не встречаю?

Благодарность

Неллиус
источник
2
automapper.codeplex.com/… Вероятно, лучшая документация для того, чем вы хотите заниматься. Не забывайте общие параметры при вызове CreateMap.
Трэвис
2
Следует отметить, что статические Mapper.CreateMap<Source, Dest>()методы, упомянутые во всех ответах ниже, теперь (2016 г.) помечены как устаревшие .
Бен Рипли

Ответы:

130

Попробуйте следующий синтаксис:

Mapper
    .CreateMap<Entity, EntityDto>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );

или если свойства источника и назначения имеют одинаковые имена, просто:

Mapper.CreateMap<Entity, EntityDto>();

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

Дарин Димитров
источник
1
Моя проблема в том, что при попытке использовать «ForMember» в этом контексте я просто получаю «Невозможно разрешить символ ForMember», как будто метода не существует
Неллиус
@Nellius, вы не показали свой нерабочий код. Я показал рабочий пример. Убедитесь, что у вас определены как исходный, так и целевой универсальные классы, что вы указали AutoMapper внутри своего проекта и синтаксис, показанный в документации (и в моем ответе), будет работать.
Дарин Димитров
4
Глупый вопрос, что значит opt?
riadh gomri 03
@riadhgomri option / options для участника
andrewb
17

В конце концов, я считаю, что это оказалась какая-то несовместимость с ReSharper.

ReSharper, похоже, привел к неправильному отображению кода Automapper, но работает нормально (даже если он отображается красным цветом с сообщениями об ошибках). Удаление ReSharper полностью устранило эту проблему.

Неллиус
источник
2
Какая версия ReSharper? Какая версия AutoMapper?
Колин Пир,
1
Я думаю , что эта проблема затрагивает AutoMapper и ReSharper 8.x в VisualStudio 2010. См github.com/AutoMapper/AutoMapper/issues/381
dthrasher
то же самое для меня с re # 8.2, но с vs 2012, с 7.0 работало нормально.
Карлос Гильермо Боланьос Лопес,
почему ответ с 51 голосом за не является выбранным ответом? смешной.
Крис Хоукс
4
Потому что он не ответил на вопрос, который я задал. Мой вопрос касался методов, которые не распознаются в Visual Studio при использовании правильного синтаксиса и правильной ссылке на все. Оказалось, что это ошибка, связанная с resharper. Другой ответ действительно отвечает на вопрос, очень похожий на тот, который я задал, но это был совершенно неверный ответ на тот, который я задал.
Неллиус
9

пример реализации будет следующим:

Mapper.CreateMap<Game, GameViewModel>()
  .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type))

Нам нужно сопоставить это свойство, поскольку имена свойств Game и GameViewModel разные - если они одинаковы и одного типа, то ForMember не понадобится.

другое использование ForMember - игнорировать сопоставления

Mapper.CreateMap<Game, GameViewModel>()
    .ForMember(dest => dest.Prize, opt => opt.Ignore());
стек72
источник
1

Это использование, а также:

  CreateMap<Azmoon, AzmoonViewModel>()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();
Mojtaba Nava
источник
-8

Ты делаешь это вот так

Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here)

На этой странице есть несколько хороших примеров

Ричард Форрест
источник