2011-08-08 12 views
60

Próbuję skonfigurować AutoMapper do konwersji z Entity na DTO. Wiem, że powinienem używać .ForMember() po Mapper.CreateMap<Entity, DTO>(), aby skonfigurować niestandardowe mapowania, ale nie wydaje się to być dostępną metodą.Jak korzystać z AutoMapper .ForMember?

Edytuj dla wyjaśnienia: Nie szukam linku do dokumentacji, którą przeczytałem, ani wyjaśnienia podstawowej składni. Używam poprawnej składni, jak opisano w odpowiedzi 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 ciągu CreateMap <> widzę „ForMember” jako ważnego sposobu mousing nad pokazuje podpis metody, jak zwykle się spodziewam. Ale gdy tylko nadam mu dwa ważne typy, ForMember mówi, że nie może rozwiązać symbolu, tak jakby ta metoda nie była dostępna.

Czy jest jakiś rodzaj ograniczeń na klasach generycznych, których nie spotykam?

Dzięki

+2

http://automapper.codeplex.com/wikipage?title=Flattening&referringTitle=Home Jest to prawdopodobnie najlepsza dokumentacja dla tego, co chcesz zrobić. Nie zapomnij o ogólnych parametrach w wywołaniu CreateMap. – Travis

+2

Należy zauważyć, że statyczne metody 'Mapper.CreateMap ()' wymienione we wszystkich odpowiedziach poniżej są teraz (2016) [oznaczone jako przestarzałe] (https://lostechies.com/jimmybogard/2016/01/21/usuwanie-the-static-api-z-automapper /). –

Odpowiedz

12

w końcu, wierzę, okazało się to być jakiś rodzaj niezgodności z ReSharper.

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

+2

Jaką wersję programu ReSharper? Jaką wersję AutoMapper? –

+1

Myślę, że ten problem wpływa na AutoMapper i ReSharper 8.x w VisualStudio 2010. Zobacz https://github.com/AutoMapper/AutoMapper/issues/381 – dthrasher

+0

samo dla mnie z ponownie 8.2, ale z vs 2012, z 7.0 pracował dobrze . –

89

Spró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łowy i docelowy mają takie same nazwy prosto:

Mapper.CreateMap<Entity, EntityDto>(); 

Proszę KASY odpowiednie sekcje documentation dla więcej szczegółów i innych scenariuszy mapowania.

+1

Mój problem polega na tym, że przy próbie użycia "ForMember" w tym kontekście po prostu pojawia się "Can not resolve symbol" ForMember "", jakby ta metoda nie istnieje – Nellius

+0

@Nellius, nie pokazałeś swojego * niepracującego * kodu . Pokazałem działający przykład.Upewnij się, że masz zdefiniowane ogólne i docelowe klasy generyczne, do których odwołujesz się do AutoMappera w projekcie, a składnia przedstawiona w dokumentacji (iw mojej odpowiedzi) będzie działać. –

+3

Głupie pytanie, co oznacza? –

-5

Robisz to jak to

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

This page ma kilka dobrych przykładów

5

implementacja próbka będzie w następujący sposób:

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

Musimy map 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, to nie będą potrzebne ForMember

innym korzystanie z ForMember jest ignorowanie mapowań

Mapper.CreateMap<Game, GameViewModel>() 
    .ForMember(dest => dest.Prize, opt => opt.Ignore()); 
Powiązane problemy