2011-05-09 14 views
6

Biorąc pod uwagę następujących źródeł:Automapper i hierarchii klas

public class SourceBase { public string TheString { get; set; } } 
public class SourceDerived : SourceBase { } 

i miejsc docelowych:

public class DestBase { public string MyString { get; set; } } 
public class DestDerived : DestBase { } 

i to mapowanie:

CreateMap<SourceBase, DestBase>() 
    .ForMember(dest => dest.MyString, o => o.MapFrom(x => x.TheString)) 
    .Include<SourceDerived, DestDerived>(); 

    CreateMap<SourceDerived, DestDerived>(); 
    Mapper.AssertConfigurationIsValid(); // Exception is thrown here 

Jednak daje to błąd odwzorowania mówiąc mystring ISN mapowane na DestDerived. Co daje? Czy naprawdę muszę powtórzyć mapowania dla właściwości klasy bazowej we wszystkich typach pochodnych (w moim rzeczywistym kodzie mam więcej niż jedną podklasę).

Edycja:

Dokładna wyjątek następujące właściwości w DestDerived 1 nie może być przypisane: MyString. Dodaj niestandardowe wyrażenie odwzorowania, zignoruj ​​lub zmień nazwę właściwości w DestDerived.

+0

Jaki jest dokładny błąd? –

Odpowiedz

0

Proszę sprawdzić ten post: http://groups.google.com/group/automapper-users/browse_thread/thread/69ba514a521e9599

To działa dobrze, jeśli zadeklarować jak w poniższym kodzie (używając AutoMapper 1.1.0.188). Nie jestem pewien, czy to rozwiązuje twój problem.

var result = Mapper.CreateMap<SourceBase, DestBase>() 
       .ForMember(dest => dest.MyString, o => o.MapFrom(x => x.TheString)); 
       //.Include<SourceDerived, DestDerived>(); 
      Mapper.CreateMap<SourceDerived, DestDerived>(); 
      var source = new SourceDerived(); 
      var destDerived = new DestDerived(); 
      source.TheString = "teststring"; 
      var mapResult = Mapper.Map<SourceBase, DestBase>(source, destDerived).MyString; 
      Console.WriteLine(mapResult); 
+0

Nie działa to dla nas. To naprawdę dziwne, że jeśli wywołasz Mapper.Map (źródło, typeof (SourceDerived), typeof (DestDerived)), to Twój przykładowy kod nie powiedzie się. Nie ma wyjątków, ale nie wykonuje się mapowania. – Andy

+0

Nazywamy również 'Mapper.AssertConfigurationIsValid()'. Myślę, że przekonasz się, że jeśli dodasz to połączenie zaraz po skonfigurowaniu mapowania, otrzymasz wyjątek wymieniony w moim poście. – Andy

+0

Dzięki za komentarze. Przepraszam, nie mogłem pomóc! –