วิธีใช้ AutoMapper .ForMember?


88

ฉันพยายามตั้งค่า AutoMapper เพื่อแปลงจาก Entity เป็น DTO ฉันรู้ว่าฉันควรจะใช้.ForMember()หลังจากMapper.CreateMap<Entity, DTO>()ตั้งค่าการแมปแบบกำหนดเอง แต่ดูเหมือนจะไม่มีวิธีการที่ใช้ได้

แก้ไขเพื่อความกระจ่าง: ฉันไม่ได้มองหาลิงค์ไปยังเอกสารที่ฉันได้อ่านหรือคำอธิบายเกี่ยวกับไวยากรณ์พื้นฐาน ฉันใช้ไวยากรณ์ที่ถูกต้องตามที่อธิบายไว้ในคำตอบและเอกสารประกอบตัวอย่างเช่น:

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

หากฉันมีชื่อประเภทที่ไม่ถูกต้องใน CreateMap <> ฉันสามารถเห็น "ForMember" เป็นวิธีการที่ถูกต้องการวางเมาส์เหนือจะแสดงลายเซ็นของวิธีการตามที่ฉันคาดไว้ตามปกติ แต่ทันทีที่ฉันให้มันถูกต้องสองประเภท ForMember บอกว่ามันไม่สามารถแก้ไขสัญลักษณ์ได้ราวกับว่าไม่มีวิธีการ

มีข้อ จำกัด บางประการในชั้นเรียนทั่วไปที่ฉันไม่ได้พบหรือไม่?

ขอบคุณ


2
automapper.codeplex.com/…น่าจะเป็นเอกสารที่ดีที่สุดสำหรับสิ่งที่คุณต้องการทำ อย่าลืมพารามิเตอร์ทั่วไปในการเรียก CreateMap
Travis

2
มันควรจะตั้งข้อสังเกตว่าคงMapper.CreateMap<Source, Dest>()วิธีการอ้างอิงในคำตอบทั้งหมดที่อยู่ด้านล่างอยู่ในขณะนี้ (2016) มีการทำเครื่องหมายที่ล้าสมัย
Ben Ripley

คำตอบ:


132

ลองใช้ไวยากรณ์ต่อไปนี้:

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

หรือหากคุณสมบัติต้นทางและปลายทางมีชื่อเหมือนกันเพียงแค่:

Mapper.CreateMap<Entity, EntityDto>();

โปรดตรวจสอบส่วนที่เกี่ยวข้องของเอกสารสำหรับรายละเอียดเพิ่มเติมและสถานการณ์การทำแผนที่อื่น ๆ


1
ปัญหาของฉันคือเมื่อพยายามใช้ "ForMember" ในบริบทนั้นฉันได้รับ "ไม่สามารถแก้ไขสัญลักษณ์ 'ForMember'" ราวกับว่าวิธีนี้ไม่มีอยู่จริง
Nellius

@Nellius คุณไม่ได้แสดงรหัสที่ไม่ทำงานของคุณ ฉันได้แสดงตัวอย่างการทำงาน ตรวจสอบให้แน่ใจว่าคุณมีทั้งคลาสทั่วไปต้นทางและปลายทางที่กำหนดไว้ซึ่งคุณได้อ้างถึง AutoMapper ภายในโปรเจ็กต์ของคุณและไวยากรณ์ที่แสดงในเอกสารประกอบ (และในคำตอบของฉัน) จะใช้งานได้
Darin Dimitrov

4
คำถามโง่ ๆ opt หมายถึงอะไร?
riadh gomri

ตัวเลือก @riadhgomri / ตัวเลือกสำหรับสมาชิก
andrewb

17

ในท้ายที่สุดฉันเชื่อว่าสิ่งนี้กลายเป็นความไม่เข้ากันกับ ReSharper

ดูเหมือนว่า ReSharper จะทำให้โค้ด Automapper แสดงไม่ถูกต้อง แต่ก็ใช้งานได้ดี (แม้ว่าจะแสดงเป็นสีแดงพร้อมข้อความแสดงข้อผิดพลาด) การถอนการติดตั้ง ReSharper แก้ไขปัญหานี้ได้อย่างสมบูรณ์


2
ReSharper รุ่นใด AutoMapper เวอร์ชันใด
Colin Pear

1
ฉันคิดว่าปัญหานี้ส่งผลกระทบต่อ AutoMapper และ ReSharper 8.x ใน VisualStudio 2010 ดูgithub.com/AutoMapper/AutoMapper/issues/381
dthrasher

เหมือนกันสำหรับฉันกับ re # 8.2 แต่เทียบกับ 2012 โดย 7.0 ทำงานได้ดี
Carlos Guillermo Bolaños Lopez

ทำไมคำตอบที่มีคะแนนโหวต 51 คะแนนถึงไม่ใช่คำตอบที่เลือก? ไร้สาระ.
Chris Hawkes

4
เพราะมันไม่ตอบคำถามที่ฉันถาม. คำถามของฉันเกี่ยวกับวิธีการที่ไม่ได้รับการยอมรับใน Visual Studio เมื่อใช้ไวยากรณ์ที่ถูกต้องและอ้างอิงทุกอย่างอย่างถูกต้อง สิ่งนี้กลายเป็นข้อผิดพลาดที่เกี่ยวข้องกับ resharper คำตอบอื่นตอบคำถามที่คล้ายกันมากกับคำถามที่ฉันถาม แต่เป็นคำตอบที่ไม่ถูกต้องสำหรับคำถามที่ฉันถามจริงๆ
Nellius

9

ตัวอย่างการใช้งานจะเป็นดังนี้:

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

เราจำเป็นต้องแมปคุณสมบัตินี้เนื่องจากชื่อของคุณสมบัติของ Game และ GameViewModel แตกต่างกัน - หากเหมือนกันและเป็นประเภทเดียวกันก็ไม่จำเป็นต้องมี ForMember

การใช้ ForMember อีกอย่างหนึ่งคือการละเว้นการแมป

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

1

การใช้งานนี้เช่นเดียวกับ:

  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();

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.