AutoMapper .ForMember का उपयोग कैसे करें?


88

मैं Entity से DTO में बदलने के लिए AutoMapper स्थापित करने का प्रयास कर रहा हूं। मुझे पता है कि मैं कस्टम मैपिंग सेट करने के .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 कॉल पर सामान्य पैरामीटर न भूलें।
— ट्रेविस

2
यह ध्यान दिया जाना चाहिए कि Mapper.CreateMap<Source, Dest>()नीचे दिए गए सभी उत्तरों में संदर्भित स्थिर तरीके अब (2016) अप्रचलित चिह्नित हैं ।
— बेन रिप्ले

जवाबों:


130

निम्न सिंटैक्स आज़माएं:

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

या यदि स्रोत और गंतव्य गुण समान नाम हैं:

Mapper.CreateMap<Entity, EntityDto>();

कृपया अधिक विवरण और अन्य मैपिंग परिदृश्यों के लिए दस्तावेज़ के संबंधित अनुभागों की जाँच करें ।


1
मेरा मुद्दा यह है कि जब "फॉरमैम्बर" को उस संदर्भ में उपयोग करने की कोशिश की जा रही है, तो मुझे "सिंबल 'फॉरमंबर' को हल नहीं करना चाहिए जैसे कि विधि मौजूद नहीं है
— नेल्सियस

@Nellius, आपने अपना गैर-कार्य कोड नहीं दिखाया है । मैंने एक काम करने वाला उदाहरण दिखाया है। सुनिश्चित करें कि आपके पास स्रोत और गंतव्य दोनों सामान्य वर्ग परिभाषित हैं, कि आपने अपनी परियोजना के अंदर AutoMapper को संदर्भित किया है और प्रलेखन में दिखाया गया सिंटैक्स (और मेरे उत्तर में) काम करेगा।
— डारिन दिमित्रोव

4
बेवकूफ सवाल, क्या विकल्प का मतलब है?
— रियाद गोमरी

@riadhgomri विकल्प / सदस्य के लिए विकल्प
— andrewb

17

अंत में, मेरा मानना ​​है कि यह रीशर के साथ किसी प्रकार की असंगति थी।

ReSharper को लगता है कि आटोमैपर कोड गलत तरीके से प्रदर्शित होता है, लेकिन ठीक काम करता है (भले ही यह त्रुटि संदेशों के साथ लाल प्रदर्शित होता है)। ReSharper की स्थापना रद्द करने से यह समस्या पूरी तरह से ठीक हो गई।


2
ReSharper का क्या संस्करण? AutoMapper का संस्करण क्या है?
— कॉलिन नाशपाती

1
मुझे लगता है कि यह समस्या VisualStudio 2010 में AutoMapper और ReSharper 8.x को प्रभावित करती है। github.com/AutoMapper/AutoMapper/issues/381
— dthrasher

मेरे लिए वही फिर से # 8.2 के साथ लेकिन 2012 के साथ, 7.0 के साथ ठीक काम किया।
— कार्लोस गुइलेर्मो बोलानोस लोपेज़

51 वोटों के साथ उत्तर चयनित उत्तर क्यों नहीं है? हास्यास्पद।
— क्रिस हॉक्स 21

4
क्योंकि यह मेरे द्वारा पूछे गए सवाल का जवाब नहीं था। मेरा सवाल दृश्य स्टूडियो में पहचाने नहीं जाने वाले तरीकों के बारे में था, जब सही वाक्यविन्यास का उपयोग करना और सब कुछ सही ढंग से संदर्भित करना। यह पुनर्जीवन से संबंधित एक बग निकला। दूसरा उत्तर मेरे द्वारा पूछे गए प्रश्न के समान ही उत्तर देता है, लेकिन यह वास्तव में पूछे गए प्रश्न के लिए पूरी तरह से गलत उत्तर था।
— नेलियस

9

एक नमूना कार्यान्वयन इस प्रकार होगा:

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

हमें इस संपत्ति को मैप करने की आवश्यकता है क्योंकि गेम और गेम व्यू के गुणों के नाम अलग-अलग हैं - यदि वे समान हैं और एक ही प्रकार के हैं तो इसके लिए 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();

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.