Automapper: actualice los valores de propiedad sin crear un nuevo objeto


260

¿Cómo puedo usar automapper para actualizar los valores de propiedades de otro objeto sin crear uno nuevo?

Respuestas:


456

Use la sobrecarga que toma el destino existente:

Mapper.Map<Source, Destination>(source, destination);

Sí, devuelve el objeto de destino, pero eso es solo para otros escenarios oscuros. Es el mismo objeto.


28
Gracias, Jimmy ... A propósito me mantuve alejado de AutoMapper porque tenía miedo de que la curva de aprendizaje afectara mi horario. Oficialmente siento haberme alejado tanto tiempo ... es mucho más fácil de lo que inicialmente pensé.
Neil T.

13
Automapper tiene que ser una de las bibliotecas más útiles que existen. Yo también lo evité durante mucho tiempo, demasiado tiempo. Empecé a usarlo hoy y estoy muy sorprendido de lo fácil que es usarlo.
mcottingham

44
No funciona para mi. Intento asignar al mismo tipo, pero devuelve un nuevo objeto. Usuario u1, u3 = nuevo Usuario (); u1 = nuevo usuario {Id = 1, NickName = "vami"}; Usuario u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter

77
Para su información, descubrí que no necesita especificar los parámetros de tipo. Simplemente, Mapper.Map (origen, destino) funcionará. Agradable y simple!
Judá Gabriel Himango

2
¿Ha cambiado el comportamiento NULL en la versión 4.2.1? Estoy viendo que el mapeo nulo en un objeto devuelve nulo; mientras que en 2.2.1, la asignación nula en un objeto existente devolvió el objeto existente.
Peter McEvoy

18

Para que esto funcione, debe crear CreateMap para los tipos de origen y destino, incluso si son del mismo tipo. Eso significa que si quieres, Mapper.Map<User, User>(user1, user2); necesitas crear un mapa como este Mapper.Create<User, User>()


1
¡Decir ah! Acabo de encontrar lo mismo y agregué un comentario a la respuesta aceptada. En mi humilde opinión la respuesta aceptada sin su explicación no es completa, pero después de mi comentario que pueda ser, finalmente :)
Andrzej Martyna

Esta es una gran adición. Sin embargo, la pregunta original no mencionaba los tipos de origen y destino, y no requería que fueran del mismo tipo.
jpaugh

4

Si desea utilizar un método de instancia de IMapper, en lugar del método estático utilizado en la respuesta aceptada, puede hacer lo siguiente (probado AutoMapper 6.2.2)

IMapper _mapper;
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Source, Destination>();
});
_mapper = config.CreateMapper();

Source src = new Source
{
//initialize properties
}

Destination dest = new dest
{
//initialize properties
}
_mapper.Map(src, dest);

destahora se actualizará con todos los valores de propiedad srcque compartió. Los valores de sus propiedades únicas seguirán siendo los mismos.

Aquí está el código fuente relevante

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.