Automapper: atualize os valores da propriedade sem criar um novo objeto

260

Como posso usar o automapper para atualizar os valores das propriedades de outro objeto sem criar um novo?

Ryudice
fonte

Respostas:

456

Use a sobrecarga que leva o destino existente:

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

Sim, ele retorna o objeto de destino, mas isso é apenas para alguns outros cenários obscuros. É o mesmo objeto.

Jimmy Bogard
fonte
28
Obrigado, Jimmy ... propositadamente, fiquei longe do AutoMapper porque tinha medo da curva de aprendizado que afetava minha agenda. Lamento oficialmente ter ficado longe por tanto tempo ... é muito mais fácil do que eu pensava inicialmente.
Neil T.
13
O Automapper deve ser uma das bibliotecas mais úteis disponíveis no mercado. Eu também evitei isso por um longo tempo, muito tempo. Comecei a usá-lo hoje e estou muito surpreso com a facilidade de uso.
mcottingham
4
Não funciona para mim. Eu tento mapear para o mesmo tipo, mas é retornar novo objeto. Usuário u1, u3 = novo Usuário (); u1 = novo usuário {Id = 1, Apelido = "vami"}; Usuário u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter
7
Para sua informação, descobri que você não precisa especificar os parâmetros de tipo. Simplesmente, o Mapper.Map (origem, destino) funcionará. Agradável e simples!
Judah Gabriel Himango
2
O comportamento NULL foi alterado na versão 4.2.1? Estou vendo que o mapeamento nulo em um objeto retorna nulo; enquanto em 2.2.1, o mapeamento nulo em um objeto existente retornou o objeto existente.
22416 Peter McEvoy #
18

Para fazer isso funcionar, você deve criar o CreateMap para os tipos de origem e destino, mesmo que sejam do mesmo tipo. Isso significa que, se você quiser, Mapper.Map<User, User>(user1, user2); precisa criar um mapa como este Mapper.Create<User, User>()

Flux Xu
fonte
1
Ha! Acabei de encontrar o mesmo e adicionei um comentário à resposta aceita. IMHO a resposta aceita sem a sua explicação não está completa, mas depois do meu comentário, pode ser, finalmente :) #
Andrzej Martyna
Este é um ótimo complemento. No entanto, a pergunta original não mencionou os tipos de origem e destino e não exigiu que eles fossem do mesmo tipo.
jpaugh
4

Se você deseja usar um método de instância do IMapper, em vez do método estático usado na resposta aceita, faça o seguinte (testado em 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);

destagora será atualizado com todos os valores de propriedade srccompartilhados. Os valores de suas propriedades exclusivas permanecerão os mesmos.

Aqui está o código fonte relevante

BobbyA
fonte