2017-10-17 66 views
5

मेरे पास ऑटोमैपर 3.1.1 का उपयोग कर एक प्रोजेक्ट है, मैं जिस मुद्दे को चला रहा हूं उसे अलग करने में सक्षम था।ऑटोमैपर में अप्रत्याशित मैपिंग क्यों होता है?

यहाँ अपने परीक्षण वर्ग हैं:

class BaseClass 
{ 
    public string PropertyA { get; set; } 
} 

class DerivedClass: BaseClass 
{ 
    public string PropertyB { get; set; } 
} 

class ContainerClass 
{ 
    public DerivedClass ComplexProperty { get; set; } 
    public string PropertyC { get; set; } 
} 

class SourceClass 
{ 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
    public string PropertyC { get; set; } 
} 

यहाँ मेरी मानचित्रण नियम हैं:

var source = new SourceClass { 
    PropertyA = "ValueA", 
    PropertyB = "ValueB", 
    PropertyC = "ValueC", 
}; 

var destination = Mapper.Map<ContainerClass>(source); 

Console.WriteLine("PropertyA: " + destination?.ComplexProperty?.PropertyA); 
Console.WriteLine("PropertyB: " + destination?.ComplexProperty?.PropertyB); 
Console.WriteLine("PropertyC: " + destination?.PropertyC); 

उत्पादन होता है:

PropertyA: ValueA 
PropertyB: 
PropertyC: ValueC 

Mapper.CreateMap<SourceClass, ContainerClass>() 
    .ForMember(d => d.ComplexProperty, o => o.MapFrom(s => Mapper.Map<DerivedClass>(s))) 
    .AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("SourceClass-> ContainerClass mapped")); 

Mapper.CreateMap<SourceClass, DerivedClass>() 
    .AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("SourceClass -> DerivedClass mapped")); 

Mapper.CreateMap<BaseClass, DerivedClass>() 
    .AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("BaseClass -> DerivedClass mapped")); 

यहाँ मेरी कोड है

मुझे उम्मीद है कि प्रॉपर्टीबी के पास "वैल्यूबी" का मूल्य होगा, लेकिन इसकी कीमत शून्य है। ऐसा होता है, क्योंकि बेसक्लास से DerivedClass के मैपर किसी कारण से निष्पादित करता है। मेरा डीबग आउटपुट निम्न है:

SourceClass -> DerivedClass mapped 
BaseClass -> DerivedClass mapped 
SourceClass -> ContainerClass mapped 

क्यों ऑटोमैपर बेस क्लास -> DerivedClass मैपिंग निष्पादित करता है?


अद्यतन: मेरियस को धन्यवाद अब मैं जानता हूँ कि BaseClass से कि मानचित्रण DerivedClass को अमान्य है। जैसा कि वह सुझाव देता है, मैं इस मानचित्रण नियम को नहीं हटा सकता, क्योंकि मुझे अपने आवेदन के लिए इसकी आवश्यकता है।

Mapper.CreateMap<BaseClass, DerivedClass>() 
    .ForMember(d => d.PropertyB, o => o.Ignore()) 
    .AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("BaseClass -> DerivedClass mapped")); 

अब Mapper.AssertConfigurationIsValid(); अपवाद अब और फेंक नहीं है: अपवाद से पता चलता है मैं PropertyB के लिए पर ध्यान न दें गयी। लेकिन मूल सवाल अभी भी खड़ा है। क्यों ऑटोमैपर बेस क्लास निष्पादित करता है -> DerivedClass मैपिंग?

उत्तर

1

जब AutoMapper मुद्दों की डिबगिंग मैं Mapper.AssertConfigurationIsValid(); मैं अपने कोड में जोड़ा फोन करके विन्यास को मान्य करने की सलाह देते हैं और मैं निम्नलिखित अपवाद संदेश मिला:

त्रुटि संदेश: AutoMapper.AutoMapperConfigurationException: मैप नहीं सदस्यों पाए गए। नीचे दिए गए प्रकारों और सदस्यों की समीक्षा करें। एक कस्टम मानचित्रण अभिव्यक्ति जोड़ें, उपेक्षा, एक कस्टम समाधानकर्ता जोड़ सकते हैं या स्रोत/गंतव्य प्रकार संशोधित

======================== ==========

BaseClass -> DerivedClass (गंतव्य सदस्य सूची) src.BaseClass -> src.DerivedClass (गंतव्य सदस्य सूची)

PropertyB

आप कर सकते हैं BaseClass -> DerivedClass के लिए मैपिंग को हटाकर समस्या को हल करें। फिर Mapper.AssertConfigurationIsValid(); पर भी कॉल फेंक नहीं आता है।

+0

मैंने अपना प्रश्न अपडेट किया। मैं बस बेस क्लास -> DerivedClass को हटा नहीं सकता, मुझे अपने आवेदन के लिए इसकी आवश्यकता है। –

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