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