Як користуватися AutoMapper .ForMember?


88

Я намагаюся налаштувати AutoMapper для перетворення з Entity на DTO. Я знаю, що маю використовувати .ForMember()після 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
Дурне питання, що означає вибір?
ріад гомрі

@riadhgomri варіант / варіанти для учасника
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 голосом «за» не є обраною? смішний.
Chris Hawkes

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());

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();

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.