Automapper: Perbarui nilai properti tanpa membuat objek baru

260

Bagaimana saya bisa menggunakan automapper untuk memperbarui nilai properti objek lain tanpa membuat yang baru?

irama
sumber

Jawaban:

456

Gunakan kelebihan yang mengambil tujuan yang ada:

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

Ya, itu mengembalikan objek tujuan, tapi itu hanya untuk beberapa skenario tidak jelas lainnya. Itu adalah objek yang sama.

Jimmy Bogard
sumber
28
Terima kasih, Jimmy ... Saya sengaja menjauh dari AutoMapper karena saya takut kurva pembelajaran memengaruhi jadwal saya. Saya secara resmi minta maaf saya telah pergi begitu lama ... itu jauh lebih mudah daripada yang saya pikirkan.
Neil T.
13
Automapper harus menjadi salah satu perpustakaan paling berguna di luar sana. Saya juga menghindarinya untuk waktu yang lama, terlalu lama. Saya mulai menggunakannya hari ini dan saya sangat terkejut betapa mudahnya menggunakannya.
mcottingham
4
Tidak bekerja untukku. Saya mencoba memetakan ke jenis yang sama, tetapi mengembalikan objek baru. Pengguna u1, u3 = Pengguna baru (); u1 = Pengguna baru {Id = 1, NickName = "vami"}; Pengguna u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter
7
FYI, saya menemukan Anda tidak perlu menentukan parameter tipe. Sederhananya, Mapper.Map (sumber, tujuan) akan berfungsi. Bagus dan sederhana!
Judah Gabriel Himango
2
Apakah perilaku NULL berubah dalam rilis 4.2.1? Saya melihat bahwa pemetaan null menjadi objek mengembalikan null; sedangkan pada 2.2.1, pemetaan null ke objek yang ada mengembalikan objek yang ada.
Peter McEvoy
18

Untuk membuat ini berfungsi, Anda harus membuat MapMap untuk jenis sumber dan tujuan meskipun jenisnya sama. Itu berarti jika Anda ingin, Mapper.Map<User, User>(user1, user2); Anda perlu membuat peta seperti ini Mapper.Create<User, User>()

Flux Xu
sumber
1
Ha! Saya baru saja menemukan yang sama dan menambahkan komentar ke jawaban yang diterima. IMHO jawaban yang diterima tanpa penjelasan Anda tidak lengkap tetapi setelah komentar saya, akhirnya :)
Andrzej Martyna
Ini adalah tambahan yang bagus. Namun, pertanyaan awal tidak menyebutkan jenis sumber dan tujuan, dan tidak mengharuskan mereka jenis yang sama.
jpaugh
4

Jika Anda ingin menggunakan metode instan IMapper, daripada metode statis yang digunakan dalam jawaban yang diterima, Anda dapat melakukan yang berikut (diuji dalam 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);

destsekarang akan diperbarui dengan semua nilai properti srcyang dibagikannya. Nilai properti uniknya akan tetap sama.

Berikut kode sumber yang relevan

BobbyA
sumber