Automapper: zaktualizuj wartości właściwości bez tworzenia nowego obiektu

260

Jak mogę użyć automappera, aby zaktualizować wartości właściwości innego obiektu bez tworzenia nowego?

ryudice
źródło

Odpowiedzi:

456

Użyj przeciążenia, które zabiera istniejące miejsce docelowe:

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

Tak, zwraca obiekt docelowy, ale dotyczy to tylko innych niejasnych scenariuszy. To ten sam obiekt.

Jimmy Bogard
źródło
28
Dzięki, Jimmy ... Celowo trzymałem się z dala od AutoMappera, ponieważ obawiałem się, że krzywa uczenia się wpłynie na mój harmonogram. Oficjalnie przepraszam, że tak długo nie byłem ... to o wiele łatwiejsze niż początkowo myślałem.
Neil T.
13
Automapper musi być jedną z najbardziej przydatnych bibliotek. Ja też tego unikałem przez długi czas, o wiele za długo. Zacząłem go używać dzisiaj i jestem bardzo zaskoczony, jak łatwo jest go używać.
mcottingham
4
Nie pracuj dla mnie. Próbuję odwzorować na ten sam typ, ale zwraca nowy obiekt. Użytkownik u1, u3 = nowy użytkownik (); u1 = nowy użytkownik {Id = 1, NickName = "vami"}; Użytkownik u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter
7
Do Twojej wiadomości, odkryłem, że nie musisz określać parametrów typu. Po prostu Mapper.Map (źródło, miejsce docelowe) będzie działać. Ładnie i prosto!
Judah Gabriel Himango,
2
Czy zachowanie NULL zmieniło się w wersji 4.2.1? Widzę, że mapowanie null na obiekt zwraca null; podczas gdy w 2.2.1 mapowanie null na istniejący obiekt zwróciło istniejący obiekt.
Peter McEvoy
18

Aby ta praca działała, musisz utworzyć mapę dla typów źródła i miejsca docelowego, nawet jeśli są one tego samego typu. Oznacza to, że jeśli chcesz, Mapper.Map<User, User>(user1, user2); musisz utworzyć taką mapę Mapper.Create<User, User>()

Flux Xu
źródło
1
Ha! Właśnie to znalazłem i dodałem komentarz do zaakceptowanej odpowiedzi. IMHO zaakceptowana odpowiedź bez twojego wyjaśnienia nie jest kompletna, ale po moim komentarzu może być, w końcu :)
Andrzej Martyna
To świetny dodatek. Jednak w pierwotnym pytaniu nie wspomniano o typach źródła i miejsca docelowego i nie wymagano, aby były one tego samego typu.
jpaugh
4

Jeśli chcesz użyć metody instancji IMapper zamiast metody statycznej użytej w zaakceptowanej odpowiedzi, możesz wykonać następujące czynności (przetestowane w 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);

destzostanie teraz zaktualizowany o wszystkie wartości właściwości, srcktóre zostały udostępnione. Wartości jego unikalnych właściwości pozostaną takie same.

Oto odpowiedni kod źródłowy

Bobby A.
źródło