2011-08-08 21 views
60

Estoy tratando de configurar AutoMapper para convertir de entidad a DTO. Sé que se supone que debo usar .ForMember() después de Mapper.CreateMap<Entity, DTO>() para configurar asignaciones personalizadas, pero esto no parece ser un método disponible.Cómo usar AutoMapper .ForMember?

Edición para aclaración: No estoy buscando un enlace a la documentación, que he leído, o una explicación de la sintaxis básica. Estoy utilizando la sintaxis correcta como se describe en las respuestas y la documentación, por ejemplo:

Mapper.CreateMap<EFAddress, Address>() 
     .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name)); 

Si tengo un nombre de tipo no válido dentro CreateMap <> puedo ver "ForMember" como un método válido, pasando el ratón sobre muestra la firma del método como normalmente esperaría. Pero tan pronto como le doy dos tipos válidos, ForMember dice que no puede resolver el símbolo, como si el método no estuviera disponible.

¿Hay algún tipo de limitación en las clases genéricas que no conozco?

Gracias

+2

http://automapper.codeplex.com/wikipage?title=Flattening&referringTitle=Home Es probablemente la mejor documentación para lo que estás buscando hacer. No olvide los parámetros genéricos en la llamada CreateMap. – Travis

+2

Se debe tener en cuenta que los métodos estáticos 'Mapper.CreateMap ()' a los que se hace referencia en todas las respuestas a continuación son ahora (2016) [marcados obsoletos] (https://lostechies.com/jimmybogard/2016/01/21/removing-the-static-api-from-automapper /). –

Respuesta

12

Al final, creo que esto resultó ser algún tipo de incompatibilidad con ReSharper.

ReSharper parece haber causado que el código de Automapper se muestre incorrectamente, pero funciona bien (aunque se muestra en rojo con mensajes de error). La desinstalación de ReSharper solucionó este problema por completo.

+2

¿Qué versión de ReSharper? ¿Qué versión de AutoMapper? –

+1

Creo que este problema afecta a AutoMapper y ReSharper 8.x en VisualStudio 2010. Consulte https://github.com/AutoMapper/AutoMapper/issues/381 – dthrasher

+0

lo mismo para mí con re # 8.2 pero con vs 2012, con 7.0 funciona bien . –

89

Prueba la siguiente sintaxis:

Mapper 
    .CreateMap<Entity, EntityDto>() 
    .ForMember(
     dest => dest.SomeDestinationProperty, 
     opt => opt.MapFrom(src => src.SomeSourceProperty) 
    ); 

o si las propiedades de origen y de destino tienen los mismos nombres simples:

Mapper.CreateMap<Entity, EntityDto>(); 

favor de partida de los artículos pertinentes de la documentation de más detalles y otros escenarios de mapeo.

+1

Mi problema es que cuando trato de usar "ForMember" en ese contexto simplemente obtengo "No puedo resolver el símbolo 'ForMember'" como si el método no existiera – Nellius

+0

@ Nelly, no has mostrado tu código * que no funciona * . He mostrado un ejemplo de trabajo.Asegúrese de tener definidas las clases genéricas de origen y de destino, que ha hecho referencia a AutoMapper dentro de su proyecto y la sintaxis que se muestra en la documentación (y en mi respuesta) funcionará. –

+3

pregunta estúpida, ¿qué opción significa? –

-5

lo haces como esto

Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here) 

This page tiene algunos buenos ejemplos

5

una implementación de ejemplo sería el siguiente:

Mapper.CreateMap<Game, GameViewModel>() 
    .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type)) 

Tenemos que trazar esta propiedad ya que los nombres de las propiedades de Game y GameViewModel son diferentes: si son iguales y del mismo tipo, no necesitará ForMember

otro uso de la ForMember es ignorar Asignaciones

Mapper.CreateMap<Game, GameViewModel>() 
    .ForMember(dest => dest.Prize, opt => opt.Ignore()); 
Cuestiones relacionadas