Mam projekt przy użyciu AutoMapper 3.1.1, udało mi się wyizolować problem, na którym działam.Dlaczego pojawia się nieoczekiwane mapowanie w AutoMapper?
Oto moje zajęcia testowe:
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; }
}
Oto moje reguły mapowania:
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"));
Oto mój kod:
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);
Wyjście jest:
PropertyA: ValueA
PropertyB:
PropertyC: ValueC
Oczekiwałem, że właściwość PropertyB będzie miała wartość "ValueB", ale zamiast tego ma wartość null. Dzieje się tak, ponieważ mapper z BaseClass do DerivedClass jest wykonywany z jakiegoś powodu. Moje dane wyjściowe debugowania są następujące:
SourceClass -> DerivedClass mapped
BaseClass -> DerivedClass mapped
SourceClass -> ContainerClass mapped
Dlaczego AutoMapper wykonuje mapowanie BaseClass -> DerivedClass?
UPDATE: Dzięki Marius Teraz wiem, że mapowanie z klasy bazowej do DerivedClass jest nieprawidłowy. Nie mogę usunąć tej reguły mapowania zgodnie z sugestią, ponieważ potrzebuję jej do mojej aplikacji. Jako wyjątek sugeruje dodałem Ignoruj dla PropertyB:
Mapper.CreateMap<BaseClass, DerivedClass>()
.ForMember(d => d.PropertyB, o => o.Ignore())
.AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("BaseClass -> DerivedClass mapped"));
Teraz Mapper.AssertConfigurationIsValid();
nie rzucać wyjątek anymore. Ale oryginalne pytanie wciąż pozostaje. Dlaczego AutoMapper wykonuje mapowanie BaseClass -> DerivedClass?
Zaktualizowałem moje pytanie. Nie mogę po prostu usunąć BaseClass -> DerivedClass, potrzebuję go dla mojej aplikacji. –