Jak korzystać z AutoMapper. ForMember?

88

Próbuję skonfigurować AutoMapper do konwersji z Entity na DTO. Wiem, że powinienem używać .ForMember()After Mapper.CreateMap<Entity, DTO>()do skonfigurowania niestandardowych mapowań, ale nie wydaje się to być dostępną metodą.

Edytuj dla wyjaśnienia: nie szukam linku do dokumentacji, którą przeczytałem, ani wyjaśnienia podstawowej składni. Używam poprawnej składni opisanej w odpowiedziach i dokumentacji, na przykład:

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

Jeśli mam nieprawidłową nazwę typu w CreateMap <>, widzę „ForMember” jako prawidłową metodę, najechanie kursorem myszy pokazuje sygnaturę metody, tak jak normalnie się tego spodziewałem. Ale gdy tylko podam dwa prawidłowe typy, ForMember mówi, że nie może rozwiązać symbolu, tak jakby metoda nie była dostępna.

Czy istnieją jakieś ograniczenia dotyczące klas ogólnych, których nie spełniam?

Dzięki

Nellius
źródło
2
automapper.codeplex.com/… Jest to prawdopodobnie najlepsza dokumentacja do tego, co chcesz zrobić. Nie zapomnij o ogólnych parametrach w wywołaniu CreateMap.
Travis
2
Należy zauważyć, że Mapper.CreateMap<Source, Dest>()metody statyczne , do których odnoszą się wszystkie poniższe odpowiedzi, są obecnie (2016 r.) Oznaczone jako przestarzałe .
Ben Ripley

Odpowiedzi:

130

Wypróbuj następującą składnię:

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

lub jeśli właściwości źródła i miejsca docelowego mają po prostu takie same nazwy:

Mapper.CreateMap<Entity, EntityDto>();

Zapoznaj się z odpowiednimi sekcjami dokumentacji, aby uzyskać więcej informacji i inne scenariusze mapowania.

Darin Dimitrov
źródło
1
Mój problem polega na tym, że kiedy próbuję użyć „ForMember” w tym kontekście, po prostu otrzymuję komunikat „Nie można rozwiązać symbolu„ ForMember ”, jakby metoda nie istniała
Nellius
@Nellius, nie pokazałeś swojego niedziałającego kodu. Pokazałem działający przykład. Upewnij się, że masz zdefiniowane zarówno źródłowe, jak i docelowe klasy generyczne, że odwołujesz się do AutoMapper w swoim projekcie i składnia pokazana w dokumentacji (iw mojej odpowiedzi) będzie działać.
Darin Dimitrov
4
Głupie pytanie, co oznacza opt?
riadh gomri
@riadhgomri opcja / opcje dla członka
andrewb
17

W końcu uważam, że okazało się to czymś w rodzaju niezgodności z ReSharper.

Wygląda na to, że ReSharper spowodował nieprawidłowe wyświetlanie kodu Automapper, ale działa dobrze (nawet jeśli wyświetla się na czerwono z komunikatami o błędach). Odinstalowanie ReSharper całkowicie rozwiązało ten problem.

Nellius
źródło
2
Jaka wersja ReSharper? Jaka wersja AutoMapper?
Colin Pear
1
Myślę, że ten problem dotyczy AutoMapper i ReSharper 8.x w VisualStudio 2010. Zobacz github.com/AutoMapper/AutoMapper/issues/381
dthrasher
to samo dla mnie z re # 8.2, ale z vs 2012, z 7.0 działało dobrze.
Carlos Guillermo Bolaños Lopez
dlaczego nie ma odpowiedzi z 51 głosami pozytywnymi, a nie wybraną odpowiedzią? śmieszny.
Chris Hawkes
4
Ponieważ nie odpowiedział na zadane przeze mnie pytanie. Moje pytanie dotyczyło metod, które nie wydają się być rozpoznawane w Visual Studio, gdy używam poprawnej składni i odnosimy się do wszystkiego poprawnie. Okazało się, że był to błąd związany z resharper. Druga odpowiedź odpowiada na bardzo podobne pytanie do tego, które zadałem, ale była to całkowicie nieprawidłowa odpowiedź na to, które faktycznie zadałem.
Nellius
9

przykładowa implementacja wyglądałaby następująco:

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

Musimy zmapować tę właściwość, ponieważ nazwy właściwości Game i GameViewModel są różne - jeśli są takie same i tego samego typu, nie będzie potrzebować ForMember

innym zastosowaniem ForMember jest ignorowanie mapowań

Mapper.CreateMap<Game, GameViewModel>()
    .ForMember(dest => dest.Prize, opt => opt.Ignore());
stos72
źródło
1

To zastosowanie, a także:

  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
źródło
-8

Robisz to w ten sposób

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

Ta strona zawiera dobre przykłady

Richard Forrest
źródło