2012-05-18 15 views
5

EDITAR: El título es incorrecto, estoy tratando de asignar desde una lista fuente a la lista fuente de un modelo anidado.Mapa de AutoMapper desde la colección anidada de origen a otra colección

Tengo problemas para tratar de asignar una lista a otra enumerada en un modelo anidado. Tipo y sin aplanar de tipo. El problema es que no sé cómo hacer las asignaciones.

Aquí es mi puesta a punto seguido mis intentos fallidos de mapeo:

public class DestinationModel 
{ 
    public DestinationNestedViewModel sestinationNestedViewModel { get; set; } 
} 

public class DestinationNestedViewModel 
{ 
    public List<ItemModel> NestedList { get; set; } 
} 

public class SourceModel 
{ 
    public List<Item> SourceList { get; set; } 
} 

Dónde punto y la ItemModel ya han definido un mapeo entre ellos

no puedo hacerlo de esta manera ...

Mapper.CreateMap<SourceModel, DestinationModel>() 
.ForMember(d => d.DestinationNestedViewModel.NestedList, 
    opt => opt.MapFrom(src => src.SourceList)) 

ERROR:

Expresión 'd => d.DestinationNestedViewMode l.NestedList' debe resolver a nombre member.Parameter de nivel superior: LambdaExpression

que luego trató de algo como esto:

.ForMember(d => d.DestinationNestedViewModel, 
o => o.MapFrom(t => new DestinationNestedViewModel { NestedList = t.SourceList })) 

El problema no es NestedList = t.SourceList. Cada uno contiene elementos diferentes, ItemModel y Artículo respectivamente. Entonces, necesitan ser mapeados.

¿Cómo puedo mapear esto?

+0

No estoy seguro de si he entendido bien , pero creo que debe crear una asignación de Item a ItemModel, por lo que AutoMapper sabe cómo asignar objetos Item a objetos ItemModel. –

+0

Ya se ha definido un mapeo entre Item y ItemModel, pero la asignación no se está desencadenando porque NestedList pertenece a un DestinationModel que a su vez pertenece a DestinationNestedViewModel. Automapper no puede manejar 2 niveles de modelos al mapear (al menos no de la manera que lo he probado) – getit

Respuesta

11

Creo que quieres algo como esto:

Mapper.CreateMap<Item, ItemModel>(); 

/* Create a mapping from Source to Destination, but map the nested property from 
    the source itself */ 
Mapper.CreateMap<SourceModel, DestinationModel>() 
    .ForMember(dest => dest.DestinationNestedViewModel, opt => opt.MapFrom(src => src)); 

/* Then also create a mapping from Source to DestinationNestedViewModel: */ 
Mapper.CreateMap<SourceModel, DestinationNestedViewModel>() 
    .ForMember(dest => dest.NestedList, opt => opt.MapFrom(src => src.SourceList)); 

Entonces todo lo que tiene que hacer es llamar Mapper.Map entre Source y Destination:

Mapper.Map<SourceModel, DestinationModel>(source); 
+0

primero mapea las colecciones de ambos objetos ... luego define las asignaciones para los objetos individuales dentro de esas colecciones ... ¡Automapper es tan genial! – hanzolo

Cuestiones relacionadas