Bagaimana cara menggunakan AutoMapper .ForMember?

88

Saya mencoba mengatur AutoMapper untuk mengonversi dari Entitas ke DTO. Saya tahu saya seharusnya menggunakan .ForMember()after Mapper.CreateMap<Entity, DTO>()untuk menyiapkan pemetaan kustom, tetapi ini sepertinya bukan metode yang tersedia.

Edit untuk klarifikasi: Saya tidak mencari tautan ke dokumentasi yang telah saya baca, atau penjelasan tentang sintaks dasar. Saya menggunakan sintaks yang benar seperti yang dijelaskan dalam jawaban dan dokumentasi, misalnya:

Mapper.CreateMap<EFAddress, Address>()
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name));

Jika saya memiliki nama tipe yang tidak valid dalam CreateMap <> saya dapat melihat "ForMember" sebagai metode yang valid, mouse menunjukkan tanda tangan metode seperti yang biasanya saya harapkan. Tetapi segera setelah saya memberikan dua tipe yang valid, ForMember mengatakan itu tidak dapat menyelesaikan simbol, seolah-olah metode tersebut tidak tersedia.

Apakah ada semacam batasan pada kelas generik yang tidak saya temui?

Terima kasih

Nellius
sumber
2
automapper.codeplex.com/… Kemungkinan merupakan dokumentasi terbaik untuk apa yang ingin Anda lakukan. Jangan lupa parameter umum pada panggilan CreateMap.
Travis
2
Perlu dicatat bahwa Mapper.CreateMap<Source, Dest>()metode statis yang direferensikan di semua jawaban di bawah ini sekarang (2016) ditandai usang .
Ben Ripley

Jawaban:

132

Coba sintaks berikut:

Mapper
    .CreateMap<Entity, EntityDto>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );

atau jika properti sumber dan tujuan memiliki nama yang sama:

Mapper.CreateMap<Entity, EntityDto>();

Silakan periksa bagian yang relevan dari dokumentasi untuk detail lebih lanjut dan skenario pemetaan lainnya.

Darin Dimitrov
sumber
1
Masalah saya adalah bahwa ketika mencoba menggunakan "ForMember" dalam konteks itu, saya hanya mendapatkan "Tidak dapat menyelesaikan simbol 'ForMember'" seolah-olah metode tersebut tidak ada
Nellius
@Nellius, Anda belum menunjukkan kode yang tidak berfungsi . Saya telah menunjukkan contoh kerja. Pastikan Anda memiliki kelas generik sumber dan tujuan yang ditentukan, bahwa Anda telah mereferensikan AutoMapper di dalam proyek Anda dan sintaks yang ditampilkan dalam dokumentasi (dan dalam jawaban saya) akan berfungsi.
Darin Dimitrov
4
Pertanyaan bodoh, apa artinya opt?
riadh gomri
@riadhgomri opsi / opsi untuk anggota
andrewb
17

Pada akhirnya, saya yakin ini ternyata semacam ketidakcocokan dengan ReSharper.

ReSharper tampaknya telah menyebabkan kode Automapper ditampilkan secara tidak benar, tetapi berfungsi dengan baik (meskipun menampilkan warna merah dengan pesan kesalahan). Mencopot pemasangan ReSharper memperbaiki masalah ini sepenuhnya.

Nellius
sumber
2
Versi ReSharper berapa? Versi AutoMapper apa?
Colin Pear
1
Saya pikir masalah ini mempengaruhi AutoMapper dan ReSharper 8.x di VisualStudio 2010. Lihat github.com/AutoMapper/AutoMapper/issues/381
dthrasher
hal yang sama untuk saya dengan re # 8.2 tetapi dengan vs 2012, dengan 7.0 bekerja dengan baik.
Carlos Guillermo Bolaños Lopez
mengapa jawaban dengan 51 suara tidak merupakan jawaban terpilih? konyol.
Chris Hawkes
4
Karena itu tidak menjawab pertanyaan yang saya ajukan. Pertanyaan saya adalah tentang metode yang tampaknya tidak dikenali di studio visual, saat menggunakan sintaks yang benar dan mereferensikan semuanya dengan benar. Ini ternyata bug yang terkait dengan resharper. Jawaban lain memang menjawab pertanyaan yang sangat mirip dengan yang saya tanyakan, tetapi itu adalah jawaban yang sepenuhnya salah untuk yang sebenarnya saya tanyakan.
Nellius
9

contoh penerapannya adalah sebagai berikut:

Mapper.CreateMap<Game, GameViewModel>()
  .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type))

Kita perlu memetakan properti ini karena nama properti Game dan GameViewModel berbeda - jika keduanya sama dan memiliki tipe yang sama maka tidak memerlukan ForMember.

Kegunaan lain dari ForMember adalah untuk Mengabaikan Pemetaan

Mapper.CreateMap<Game, GameViewModel>()
    .ForMember(dest => dest.Prize, opt => opt.Ignore());
tumpukan72
sumber
1

Penggunaan ini serta:

  CreateMap<Azmoon, AzmoonViewModel>()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();
Mojtaba Nava
sumber
-8

Apakah Anda melakukannya seperti ini

Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here)

Halaman ini memiliki beberapa contoh yang bagus

Richard Forrest
sumber