2012-07-24 6 views
14

Sto utilizzando la funzione di automapper per mappare gli oggetti di origine e destinazione. Mentre li mappo ottengo il seguente errore.L'espressione di automapper deve essere risolta nel membro di livello superiore

L'espressione deve essere risolta nel membro di livello superiore. Nome parametro: lambdaExpression

Non riesco a risolvere il problema.

miei origine e di destinazione sono gli oggetti:

public partial class Source 
{ 
     private Car[] cars; 

     public Car[] Cars 
     { 
      get { return this.cars; } 
      set { this.cars = value; } 
     } 
} 

public partial class Destination 
{ 
     private OutputData output; 

     public OutputData Output 
     {    
      get { return this.output; } 
      set { this.output= value; } 
     } 
} 

public class OutputData 
{ 
     private List<Cars> cars; 

     public Car[] Cars 
     { 
      get { return this.cars; } 
      set { this.cars = value; } 
     } 
} 

devo mappare Source.Cars con Destination.OutputData.Cars oggetto. Potresti per favore aiutarmi in questo?

+1

Potresti aggiungere la configurazione di automapper? – k0stya

+0

Ho provato ad aggiungere la configurazione, genera errore durante l'esecuzione delle configurazioni. La mia configurazione appare come sotto Mapper.CreateMap (). ForMember (dest => dest.OutputData.Cars, input => input.MapFrom (i => i.Cars)); L'espressione 'dest => dest.OutputData.Cars' deve essere risolta nel membro di livello superiore. Nome parametro: lambdaExpression –

risposta

15
  1. Definire mappatura tra Source e OutputData.

    Mapper.CreateMap<Source, OutputData>(); 
    
  2. aggiornare la configurazione per mappare Destination.Output con OutputData.

    Mapper.CreateMap<Source, Destination>().ForMember(dest => dest.Output, input => 
        input.MapFrom(s=>Mapper.Map<Source, OutputData>(s))); 
    
+0

Grazie per la rapida risposta. –

+0

Ho un campo in OutputData che ha qualche valore predefinito. Non ho una mappatura per questo campo nella fonte. Quindi non l'ho mappato. Al termine della mappatura, il mio valore predefinito è impostato sul valore nullo sulla destinazione. Come evitarlo impostando su un valore nullo. –

23

Si sta utilizzando:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.OutputData.Cars, 
      input => input.MapFrom(i => i.Cars)); 

Questo non funziona perché si sta utilizzando 2 livello nel lambda dest.

Con Automapper, è possibile mappare solo a 1 livello. Per risolvere il problema è necessario utilizzare un unico livello:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.OutputData, 
      input => input.MapFrom(i => new OutputData{Cars=i.Cars})); 

In questo modo, è possibile impostare le proprie auto sulla destinazione.

+0

Utilizzato anche questa soluzione per la mappatura tra oggetti in cui la fonte aveva 'stringa somethingKey' e' somethingValue' stringa e la destinazione aveva 'oggetto qualcosa {chiave string, string valore}' – st3inn

+0

Greate risposta !! – Ricardo

4

Si può fare in questo modo:

// First: create mapping for the subtypes 
Mapper.CreateMap<Source, OutputData>(); 

// Then: create the main mapping 
Mapper.CreateMap<Source, Destination>(). 
    // chose the destination-property and map the source itself 
    ForMember(dest => dest.Output, x => x.MapFrom(src => src)); 

Questo è il mio modo per farlo ;-)

+0

Questa è la soluzione migliore – Pachu

+0

Funziona perfettamente quando si desidera mappare IDataRecord su DTO complesso. – ironcurtain

0

La risposta corretta data dal allrameest su questa questione dovrebbe aiutare: AutoMapper - Deep level mapping

Questo è quello che ti serve:

Mapper.CreateMap<Source, Destination>() 
    .ForMember(dest => dest.OutputData, opt => opt.MapFrom(i => i)); 
Mapper.CreateMap<Source, OutputData>() 
    .ForMember(dest => dest.Cars, opt => opt.MapFrom(i => i.Cars)); 

Quando si utilizza il mapper, utilizzare:

var destinationObj = Mapper.Map<Source, Destination>(sourceObj) 

dove destinationObj è un'istanza di Destination e sourceObj è un'istanza di Source.

NOTA: a questo punto dovresti cercare di allontanarti dall'uso di Mapper.CreateMap, è obsoleto e non sarà presto supportato.

Problemi correlati