2012-07-24 17 views
14

Estoy utilizando el automapper para asignar objetos de origen y destino. Mientras los mapeo obtengo el siguiente error.La expresión de Automapper debe resolverse como miembro de nivel superior

La expresión debe resolverse en miembro de nivel superior. Nombre del parámetro: lambdaExpression

No puedo resolver el problema.

Mi origen y de destino son objetos:

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; } 
     } 
} 

tengo que trazar Source.Cars con Destination.OutputData.Cars objeto. ¿Podrías ayudarme en esto?

+1

¿Podría agregar la configuración de Automapper? – k0stya

+0

Traté de agregar la configuración, arroja un error al ejecutar las configuraciones. Mi configuración se ve a continuación Mapper.CreateMap (). ForMember (dest => dest.OutputData.Cars, input => input.MapFrom (i => i.Cars)); La expresión 'dest => dest.OutputData.Cars' debe resolverse en miembro de nivel superior. Nombre del parámetro: lambdaExpression –

Respuesta

15
  1. Definir asignación entre Source y OutputData.

    Mapper.CreateMap<Source, OutputData>(); 
    
  2. actualizar la configuración de mapa Destination.Output con OutputData.

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

Gracias por la respuesta rápida. –

+0

Tengo campo en OutputData que tiene algún valor predeterminado. No tengo un mapeo para este campo en la fuente. Entonces no lo mapeé. Después de realizar la asignación, mi valor predeterminado se establece en valor nulo en el destino. Cómo evitar que se establezca en un valor nulo. –

23

Está utilizando:

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

Esto no funcionará porque está utilizando de 2 niveles en la lambda dest.

Con Automapper, solo se puede asignar a 1 nivel. Para solucionar el problema, necesita utilizar un solo nivel:

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

De esta manera, puede configurar sus coches hasta el destino.

+0

También usé esta solución para mapear entre objetos donde la fuente tenía 'string somethingKey' y' string somethingValue', y el destino tenía 'object something {string Key, string Value}' – st3inn

+0

Greate Answer !! – Ricardo

4

Puede hacerlo de esa manera:

// 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)); 

Esa es mi manera de hacerlo ;-)

+0

Esta es la mejor solución – Pachu

+0

Funciona perfecto cuando desea asignar IDataRecord a DTO complejo. – ironcurtain

0

La respuesta correcta dada por allrameest sobre esta cuestión debería ayudar: AutoMapper - Deep level mapping

Este es lo que necesita:

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)); 

Al utilizar el asignador, utilice:

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

donde destinationObj es una instancia de Destination y sourceObj es una instancia de Source.

NOTA: Intente alejarse del uso de Mapper.CreateMap en este punto, ya que está obsoleto y no se admitirá pronto.

Cuestiones relacionadas