2012-11-21 21 views
42

Ho il caso in cui voglio mappare un'entità a un modello di vista e viceversa. Devo specificare il mapping esplicitamente con ForMember() perché le loro proprietà non condividono gli stessi nomi identici. Ecco un breve esempio di come le mie classi assomigliano:Automapper: mappatura bidirezionale con ReverseMap() e ForMember()

public class PartTwo { 
    public int Integer { get; set; } 
} 

public class PartTwoViewModel { 
    public int PartInteger { get; set; } 
} 

e voglio usarli in questo modo:

Mapper.CreateMap<PartTwo, PartTwoViewModel>() 
    .ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer)) 
    .ReverseMap(); 

var partTwoViewModel = new PartTwoViewModel() { PartInteger = 42 }; 
var partTwo = Mapper.Map<PartTwoViewModel, PartTwo>(partTwoViewModel); 
Assert.AreEqual(partTwoViewModel.PartInteger, partTwo.Integer); 

Ma non corrisponde alla PartInteger proprietà Integer. (L'intero è 0.)

C'è un modo per farlo funzionare? (Quando le proprietà di entrambe le classi hanno lo stesso nome funziona.) Devo impostare qualche tipo di opzione nel metodo ForMember()?

risposta

42

Si potrebbe definire la configurazione come questa:

Mapper.CreateMap<PartTwo, PartTwoViewModel>() 
    .ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer)); 

Mapper.CreateMap<PartTwoViewModel, PartTwo>() 
    .ForMember(dst => dst.Integer, opt => opt.MapFrom(src => src.PartInteger)); 

UPDATE

Ecco the commit dove ReverseMap è stato inizialmente implementato. Da quello che posso vedere nel codice, crea solo una semplice mappatura inversa. Per esempio, in questo caso sarebbe configurare automaticamente l'equivalente di:

Mapper.CreateMap<PartTwoViewModel, PartTwo>(); 

Per avere qualcosa di più complesso, ho paura che si sta andando ad avere per configurarlo manualmente.

+0

Sì, questo funziona. Speravo che non avrei dovuto definire la mappatura inversa, perché ho molte proprietà che mappo tramite ForMember(). – toni

+0

Ecco l'esempio: https://dotnetfiddle.net/0x8csL – Sergey

118

ReverseMap restituisce uno IMappingExpression che rappresenta l'inversione della mappatura. Una volta che chiami, le chiamate successive serviranno per configurare l'inversione della mappa.

Ecco un esempio:

Mapper.CreateMap<CartItemDto, CartItemModel>() 
     .ForMember(dest => dest.ExtendedCost, opt => opt.Ignore()) 
     .ReverseMap() 
      .ForMember(dest => dest.Pricing, opt => opt.Ignore()) 

Questo ignorerà il campo Pricing nella direzione opposta.

+0

Eccellente. Mentre è ancora scomodo dover creare nuovamente i mapping dei membri, è meglio che dover creare una mappa completamente nuova. – Cody

+1

Il mio vantaggio va qui. Ecco l'esempio: https://dotnetfiddle.net/0x8csL – Sergey

+0

@jon Wingfield Apprezzo la tua risposta, ma sono anche un po 'confuso. Se devo ancora ripetere tutte le chiamate .ForMember dopo aver chiamato ReverseMap, mi sta guadagnando qualcosa? E 'solo un errore. L'autore è rotto? – JMarsch