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
źródło
Mapper.CreateMap<Source, Dest>()
metody statyczne , do których odnoszą się wszystkie poniższe odpowiedzi, są obecnie (2016 r.) Oznaczone jako przestarzałe .Odpowiedzi:
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.
źródło
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.
źródło
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());
źródło
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();
źródło
Robisz to w ten sposób
Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here)
Ta strona zawiera dobre przykłady
źródło