2013-03-21 10 views
22

Sto cercando di mappare gli oggetti con i membri più livelli: queste sono le classi:automapper - mappatura livello profondo

public class Father 
    { 
     public int Id { get; set; } 
     public Son Son { get; set; } 
    } 

    public class FatherModel 
    { 
     public int Id { get; set; } 
     public int SonId { get; set; } 
    } 

    public class Son 
    { 
     public int Id { get; set; } 
    } 

Questo è quanto cerco Automap che:

AutoMapper.Mapper.CreateMap<FatherModel , Father>() 
         .ForMember(dest => dest.Son.Id, opt => opt.MapFrom(src => src.SonId)); 

questo è l'eccezione che ottengo:

Espressione 'dest => Converti (dest.Son.Id)' deve risolvere al livello superiore membro un d non tutte le proprietà dell'oggetto figlio. Utilizzare un resolver personalizzato su il tipo di figlio o l'opzione AfterMap. Nome del parametro: lambdaExpression

Grazie

risposta

30

Questo funziona sia per la mappatura di una nuova o ad un oggetto esistente.

Mapper.CreateMap<FatherModel, Father>() 
    .ForMember(x => x.Son, opt => opt.MapFrom(model => model)); 
Mapper.CreateMap<FatherModel, Son>() 
    .ForMember(x => x.Id, opt => opt.MapFrom(model => model.SonId)); 
+3

La parte importante di questa risposta è la mappatura della proprietà Figlio al modello, che è quello che impone l'utilizzo della seconda mappatura (linea 2). – Steve

0

duplicato: https://stackoverflow.com/a/8944694/1586498

Mapper.CreateMap<DomainClass, Child>(); 
Mapper.CreateMap<DomainClass, Parent>() 
    .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id)) 
    .ForMember(d => d.A, opt => opt.MapFrom(s => s.A)) 
    .ForMember(d => d.Child, 
      opt => opt.MapFrom(s => Mapper.Map<DomainClass, Child>(s))); 

Grazie a: @justin-niessner