2017-10-17 58 views
5

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?

Odpowiedz

1

Podczas debugowania problemów AutoMapper Polecam sprawdzić poprawność konfiguracji poprzez wywołanie Mapper.AssertConfigurationIsValid(); I dodaniu go do kodu i mam następujący komunikat wyjątku: Wiadomość

błędu: AutoMapper.AutoMapperConfigurationException: unmapped członków zostało znalezione. Przejrzyj typy i członków poniżej. Dodaj niestandardowy odwzorowania ekspresji, ignorować, dodać niestandardową rozpoznawania nazw, lub zmienić typ źródłowy/docelowy

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

klasy bazowej -> DerivedClass (lista członkiem Destination) src.BaseClass -> src.DerivedClass (lista członkiem Destination)

PropertyB

można rozwiązać problem, usuwając mapowanie dla BaseClass -> DerivedClass. Wtedy też połączenie z numerem Mapper.AssertConfigurationIsValid(); nie będzie już wyrzucane.

+0

Zaktualizowałem moje pytanie. Nie mogę po prostu usunąć BaseClass -> DerivedClass, potrzebuję go dla mojej aplikacji. –