Automapper: mettre à jour les valeurs des propriétés sans créer un nouvel objet

260

Comment puis-je utiliser automapper pour mettre à jour les valeurs des propriétés d'un autre objet sans en créer un nouveau?

ryudice
la source

Réponses:

456

Utilisez la surcharge qui prend la destination existante:

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

Oui, il renvoie l'objet de destination, mais c'est juste pour certains autres scénarios obscurs. C'est le même objet.

Jimmy Bogard
la source
28
Merci, Jimmy ... Je suis délibérément resté à l'écart d'AutoMapper parce que j'avais peur que la courbe d'apprentissage ait un impact sur mon emploi du temps. Je suis officiellement désolé de ne pas être resté si longtemps ... c'est beaucoup plus facile que je ne le pensais au départ.
Neil T.
13
Automapper doit être l'une des bibliothèques les plus utiles du marché. Moi aussi, je l'ai évité pendant longtemps, beaucoup trop longtemps. J'ai commencé à l'utiliser aujourd'hui et je suis très surpris de sa facilité d'utilisation.
mcottingham
4
Ne fonctionne pas pour moi. J'essaie de mapper au même type, mais c'est retourner un nouvel objet. Utilisateur u1, u3 = nouvel utilisateur (); u1 = nouvel utilisateur {Id = 1, NickName = "vami"}; Utilisateur u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter
7
Pour info, j'ai découvert que vous n'avez pas besoin de spécifier les paramètres de type. Simplement, Mapper.Map (source, destination) fonctionnera. Agréable et simple!
Judah Gabriel Himango
2
Le comportement NULL a-t-il changé dans la version 4.2.1? Je vois que le mappage null dans un objet renvoie null; tandis qu'en 2.2.1, le mappage null dans un objet existant a renvoyé l'objet existant.
Peter McEvoy
18

Pour que cela fonctionne, vous devez créer une carte pour les types de source et de destination, même s'ils sont du même type. Cela signifie que si vous le souhaitez, Mapper.Map<User, User>(user1, user2); vous devez créer une carte comme celle-ci. Mapper.Create<User, User>()

Flux Xu
la source
1
Ha! Je viens de trouver la même chose et j'ai ajouté un commentaire à la réponse acceptée. À mon humble avis, la réponse acceptée sans votre explication n'est pas complète, mais après mon commentaire, elle pourrait l'être, enfin :)
Andrzej Martyna
Ceci est un excellent ajout. Cependant, la question d'origine ne mentionnait pas les types de source et de destination et n'exigeait pas qu'ils soient du même type.
jpaugh
4

Si vous souhaitez utiliser une méthode d'instance d'IMapper, plutôt que la méthode statique utilisée dans la réponse acceptée, vous pouvez faire ce qui suit (testé dans 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);

destsera désormais mis à jour avec toutes les valeurs de propriété de srccelui qu'il a partagé. Les valeurs de ses propriétés uniques resteront les mêmes.

Voici le code source pertinent

BobbyA
la source