2011-11-09 21 views
8

To jest moje źródło:mapa Automapper z zagnieżdżonych klasy pojedynczej (spłaszczyć)

public class User 
{ 
    public int UserId { get; set; } 

    public Address Address { get; set; } 
} 

public class Address 
{ 
    public string Address { get; set; } 
    public string State {get; set; } 
} 

To jest mój cel podróży:

public class UserVM 
{ 
    public int UserId { get; set; } 

    public string Address { get; set; } 
    public string State { get; set; } 
} 

Jak zrobić mapowanie? Normalna mapa tworzenia nie działa, gdy mówią, że spłaszczenie jest automatyczne.

Odpowiedz

15

Jeśli zmienisz nazwy właściwości klasy przeznaczenia do AddressStreet i AddressState, AutoMapper będzie umownie dopasować je do Address.Street i Address.State źródła.

public class UserVM 
{ 
    public int UserId { get; set; } 

    public string AddressStreet { get; set; } // User.Address.Street 
    public string AddressState { get; set; } // User.Address.State 
} 

Alternatywnie, możesz zostawić swoje nazwy właściwości przeznaczenia, jak jest i użyć mapowania zwyczaj członków:

Mapper.CreateMap<User, UserVM>() 
    .ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Address.Street)) 
    .ForMember(dest => dest.State, opt => opt.MapFrom(src => src.Address.State)); 

Zobacz dokumentację AutoMapper dla Projection i Flattening aby uzyskać więcej informacji.

+1

Jak głęboko to się dzieje? Co jeśli mam tego użytkownika z dziećmi, które również mają adresy? –

+0

@Lolcoder, nie jestem pewien; Nie widzę żadnych ograniczeń wymienionych w dokumentacji. Być może warto zadać nowe pytanie komuś, kto bardziej zna się na AutoMapperie niż ja. –

+0

Czy istnieje prosty sposób na odwrócenie tego z tą samą konwencją? –