2012-07-24 6 views
14

पर हल करना होगा, मैं स्रोत और गंतव्य ऑब्जेक्ट्स को मैप करने के लिए ऑटोमैपर का उपयोग कर रहा हूं। जबकि मैं उन्हें मानचित्र करता हूं मुझे नीचे त्रुटि मिलती है।ऑटोमैपर अभिव्यक्ति को शीर्ष-स्तरीय सदस्य

अभिव्यक्ति को शीर्ष-स्तरीय सदस्य को हल करना होगा। पैरामीटर नाम: lambdaExpression

मैं इस मुद्दे को हल करने में सक्षम नहीं हूं।

मेरे स्रोत और गंतव्य वस्तुओं रहे हैं:

public partial class Source 
{ 
     private Car[] cars; 

     public Car[] Cars 
     { 
      get { return this.cars; } 
      set { this.cars = value; } 
     } 
} 

public partial class Destination 
{ 
     private OutputData output; 

     public OutputData Output 
     {    
      get { return this.output; } 
      set { this.output= value; } 
     } 
} 

public class OutputData 
{ 
     private List<Cars> cars; 

     public Car[] Cars 
     { 
      get { return this.cars; } 
      set { this.cars = value; } 
     } 
} 

मैं Destination.OutputData.Cars वस्तु के साथ Source.Cars मैप करने के लिए किया है। क्या आप कृपया इस में मेरी मदद कर सकते हैं?

+1

क्या आप ऑटोमैपर कॉन्फ़िगरेशन जोड़ सकते हैं? – k0stya

+0

मैंने कॉन्फ़िगरेशन जोड़ने की कोशिश की, यह कॉन्फ़िगरेशन चलाते समय त्रुटि फेंकता है। मेरा कॉन्फ़िगरेशन नीचे के रूप में दिखता है Mapper.CreateMap <स्रोत, गंतव्य>()। ForMember (dest => dest.OutputData.Cars, input => input.MapFrom (i => i.Cars)); अभिव्यक्ति 'dest => dest.OutputData.Cars' को शीर्ष-स्तरीय सदस्य को हल करना होगा। पैरामीटर नाम: lambdaExpression –

उत्तर

15
  1. Source और OutputData के बीच मानचित्रण परिभाषित करें।

    Mapper.CreateMap<Source, OutputData>(); 
    
  2. अद्यतन आपके विन्यास OutputData साथ Destination.Output मैप करने के लिए।

    Mapper.CreateMap<Source, Destination>().ForMember(dest => dest.Output, input => 
        input.MapFrom(s=>Mapper.Map<Source, OutputData>(s))); 
    
+0

त्वरित उत्तर के लिए धन्यवाद। –

+0

मेरे पास आउटपुटडेटा में फ़ील्ड है जिसमें कुछ डिफ़ॉल्ट मान है। मेरे पास इस क्षेत्र के स्रोत में मैपिंग नहीं है। तो मैंने इसे मैप नहीं किया। मानचित्रण करने के बाद, मेरा डिफ़ॉल्ट मान गंतव्य पर शून्य मान पर सेट होता है। इसे शून्य मान पर सेट करने से कैसे बचें। –

23

आप उपयोग कर रहे हैं:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.OutputData.Cars, 
      input => input.MapFrom(i => i.Cars)); 

इसका कारण यह है कि आप गंतव्य लैम्ब्डा में 2 स्तर का उपयोग कर रहे काम नहीं करेगा।

ऑटोमैपर के साथ, आप केवल 1 स्तर तक मानचित्र कर सकते हैं। समस्या को ठीक करने के लिए आपको एक स्तर का उपयोग करने की आवश्यकता है:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.OutputData, 
      input => input.MapFrom(i => new OutputData{Cars=i.Cars})); 

इस तरह, आप अपनी कारों को गंतव्य पर सेट कर सकते हैं।

// First: create mapping for the subtypes 
Mapper.CreateMap<Source, OutputData>(); 

// Then: create the main mapping 
Mapper.CreateMap<Source, Destination>(). 
    // chose the destination-property and map the source itself 
    ForMember(dest => dest.Output, x => x.MapFrom(src => src)); 

करने के लिए अपने रास्ते कि ;-)

+0

ऑब्जेक्ट्स के बीच मैपिंग के लिए भी इस समाधान का उपयोग किया गया था जहां स्रोत 'स्ट्रिंग कुछ था' और 'स्ट्रिंग कुछ वैल्यू' था, और गंतव्य के पास कुछ ऑब्जेक्ट था {स्ट्रिंग कुंजी, स्ट्रिंग वैल्यू} ' – st3inn

+0

ग्रीट उत्तर !! – Ricardo

4

आप इसे इस तरह से कर सकते हैं आपको क्या चाहिए:

Mapper.CreateMap<Source, Destination>() 
    .ForMember(dest => dest.OutputData, opt => opt.MapFrom(i => i)); 
Mapper.CreateMap<Source, OutputData>() 
    .ForMember(dest => dest.Cars, opt => opt.MapFrom(i => i.Cars)); 

मैपर का उपयोग करते समय, उपयोग करें:

var destinationObj = Mapper.Map<Source, Destination>(sourceObj) 

जहां गंतव्य ओबीजे गंतव्य का एक उदाहरण है और स्रोत ओबीजे स्रोत का एक उदाहरण है।

नोट: आपको इस बिंदु पर Mapper.CreateMap का उपयोग करने से दूर जाने का प्रयास करना चाहिए, यह अप्रचलित है और जल्द ही असमर्थित होगा।

+0

यह सबसे अच्छा समाधान है – Pachu

+0

जब आप नक्शा IDataRecord जटिल डीटीओ चाहते हैं तो सही काम करता है। – ironcurtain

0

इस प्रश्न पर allrameest द्वारा दिए गए सही उत्तर की मदद करनी चाहिए है कि: AutoMapper - Deep level mapping

यह वह जगह है

संबंधित मुद्दे