Automapper: aggiorna i valori delle proprietà senza creare un nuovo oggetto


260

Come posso usare automapper per aggiornare i valori delle proprietà di un altro oggetto senza crearne uno nuovo?

Risposte:


456

Utilizzare il sovraccarico che prende la destinazione esistente:

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

Sì, restituisce l'oggetto di destinazione, ma è solo per alcuni altri scenari oscuri. È lo stesso oggetto.


28
Grazie, Jimmy ... Mi sono volutamente allontanato da AutoMapper perché avevo paura che la curva di apprendimento avesse un impatto sul mio programma. Mi dispiace ufficialmente di essere rimasto così a lungo ... è molto più facile di quanto pensassi inizialmente.
Neil T.

13
Automapper deve essere una delle librerie più utili là fuori. Anch'io l'ho evitato a lungo, troppo a lungo. Ho iniziato a usarlo oggi e sono molto sorpreso di quanto sia facile da usare.
McCottingham

4
Non lavorare per me. Provo a mappare sullo stesso tipo, ma restituisce un nuovo oggetto. Utente u1, u3 = nuovo utente (); u1 = nuovo utente {Id = 1, NickName = "vami"}; User u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter,

7
Cordiali saluti, ho scoperto che non è necessario specificare i parametri del tipo. Semplicemente, Mapper.Map (sorgente, destinazione) funzionerà. Bello e semplice!
Giuda Gabriel Himango,

2
Il comportamento NULL è cambiato nella versione 4.2.1? Sto vedendo che mappare null in un oggetto restituisce null; mentre in 2.2.1, mappare null in un oggetto esistente ha restituito l'oggetto esistente.
Peter McEvoy,

18

Per fare questo devi creare CreateMap per i tipi di origine e destinazione anche se sono dello stesso tipo. Ciò significa che se vuoi, Mapper.Map<User, User>(user1, user2); devi creare una mappa come questa Mapper.Create<User, User>()


1
Ha! Ho appena trovato lo stesso e ho aggiunto un commento alla risposta accettata. IMHO la risposta accettata senza la tua spiegazione non è completa ma dopo il mio commento potrebbe essere, finalmente :)
Andrzej Martyna,

Questa è un'ottima aggiunta. Tuttavia, la domanda originale non menzionava i tipi di origine e destinazione e non richiedeva che fossero dello stesso tipo.
jpaugh

4

Se si desidera utilizzare un metodo di istanza di IMapper, anziché il metodo statico utilizzato nella risposta accettata, è possibile effettuare le seguenti operazioni (testato in 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);

destverrà ora aggiornato con tutti i valori delle proprietà da srcquello condiviso. I valori delle sue proprietà uniche rimarranno gli stessi.

Ecco il codice sorgente pertinente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.