¿Cómo utilizar AutoMapper .ForMember?


88

Estoy tratando de configurar AutoMapper para convertir de Entity a DTO. Sé que se supone que debo usar .ForMember()after Mapper.CreateMap<Entity, DTO>()para configurar asignaciones personalizadas, pero este no parece ser un método disponible.

Edite para aclarar: no estoy buscando un enlace a la documentación, que he leído, o una explicación de la sintaxis básica. Estoy usando 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 de CreateMap <>, puedo ver "ForMember" como un método válido, al pasar el mouse 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.

¿Existe algún tipo de restricción en las clases genéricas que no estoy cumpliendo?

Gracias


2
automapper.codeplex.com/… Es probablemente la mejor documentación para lo que está buscando hacer. No olvide los parámetros genéricos en la llamada CreateMap.
Travis

2
Cabe señalar que los Mapper.CreateMap<Source, Dest>()métodos estáticos a los que se hace referencia en todas las respuestas a continuación están ahora (2016) marcados como obsoletos .
Ben Ripley

Respuestas:


130

Pruebe la siguiente sintaxis:

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

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

Mapper.CreateMap<Entity, EntityDto>();

Consulte las secciones relevantes de la documentación para obtener más detalles y otros escenarios de mapeo.


1
Mi problema es que cuando intento usar "ForMember" en ese contexto, simplemente obtengo "No se puede resolver el símbolo 'ForMember'" como si el método no existiera
Nellius

@Nellius, no ha mostrado su 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 haya hecho referencia a AutoMapper dentro de su proyecto y que la sintaxis que se muestra en la documentación (y en mi respuesta) funcione.
Darin Dimitrov

4
Pregunta estúpida, ¿qué significa optar?
Riad gomri,

@riadhgomri opción / opciones para el miembro
andrewb

17

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?
Colin Pear

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

lo mismo para mí con re # 8.2 pero con vs 2012, con 7.0 funcionó bien.
Carlos Guillermo Bolaños Lopez

¿Por qué la respuesta con 51 votos positivos no es la respuesta seleccionada? ridículo.
Chris Hawkes

4
Porque no respondió la pregunta que hice. Mi pregunta era sobre los métodos que no parecen ser reconocidos en Visual Studio, cuando se usa la sintaxis correcta y se hace referencia a todo correctamente. Esto resultó ser un error relacionado con resharper. La otra respuesta responde una pregunta muy similar a la que hice, pero fue una respuesta completamente incorrecta a la que realmente pregunté.
Nellius

9

una implementación de muestra sería la siguiente:

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

Necesitamos mapear esta propiedad ya que los nombres de las propiedades de Game y GameViewModel son diferentes; si son iguales y del mismo tipo, entonces no necesitará un ForMember

otro uso de ForMember es ignorar asignaciones

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

1

Este uso así como:

  CreateMap<Azmoon, AzmoonViewModel>()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();

-8

Lo estás haciendo así

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

Esta página tiene algunos buenos ejemplos

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.