2010-03-15 16 views
27

È possibile ignorare la mappatura di un membro in base al valore di una proprietà di origine?Automapper: Ignora a condizione di

Per esempio, se si ha:

public class Car 
{ 
public int Id { get; set; } 
public string Code { get; set; } 
} 

public class CarViewModel 
{ 
public int Id { get; set; } 
public string Code { get; set; } 
} 

che sto cercando qualcosa di simile

Mapper.CreateMap<CarViewModel, Car>() 
.ForMember(dest => dest.Code, opt => opt.Ignore().If(source => source.Id == 0)) 

Finora l'unica soluzione che ho è troppo utilizzare due diversi modelli di visualizzare e creare mappature diverse per ognuno.

risposta

39

La funzione Ignore() è strettamente per i membri che non si mappano mai, poiché questi membri vengono saltati anche nella convalida della configurazione. Ho controllato un paio di opzioni, ma non sembra che cose come un risolutore di valori personalizzato faranno il trucco. Invece, io guardo l'aggiunta di un'opzione di configurazione Skip condizionale, come:

Mapper.CreateMap<CarViewModel, Car>() 
.ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id == 0)) 
+0

+1 per questa funzione :) –

+0

eccellente. Grazie mille. – Castrohenge

+1

Qual è lo stato di questa funzione? Quando possiamo aspettarcelo? – mare

4

mi sono imbattuto in un problema simile, e mentre questo sovrascriverà il valore esistente per dest.Code con nulla, potrebbe essere utile come punto di partenza punto:

AutoMapper.Mapper.CreateMap().ForMember(dest => dest.Code,config => config.MapFrom(source => source.Id != 0 ? null : source.Code));

+0

Bel trucco non avevo visto me stesso, ma il modo di Jimmy è ancora migliore. – alehro