2012-09-18 3 views
5

Ich stehe vor einem Problem mit AutoMapper 2.1.267.0, wenn ich mit Objekten arbeite, die Sammlungen abgeleiteter Klassen enthalten. Ich habe mein Problem in einem einfacheren Szenario mit den folgenden Klassen isoliert:AutoMapper funktioniert nicht mit Auflistung abgeleiteter Klassen

public class ClassABase 
{ 
    public string Name { get; set; } 
} 

public class ClassA : ClassABase 
{ 
    public string Description { get; set; } 
} 

public class ClassBBase 
{ 
    public string Title { get; set; } 
} 

public class ClassB : ClassBBase 
{ 
    public string Text { get; set; } 
} 

public class ContainerA 
{ 
    public IList<ClassA> ClassAList { get; set; } 
    public ClassA ClassA { get; set; } 
} 

public class ContainerB 
{ 
    public IList<ClassB> ClassBList { get; set; } 
    public ClassB ClassB { get; set; } 
} 

und diese Zuordnungen

public class ClassABaseToClassBBase : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassABase, ClassBBase>() 
      .Include<ClassA, ClassB>() 
      .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Name)); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

public class ClassAToClassB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassA, ClassB>() 
      .ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Description)); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

public class ContainerAToContainerB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ContainerA, ContainerB>() 
      .ForMember(dest => dest.ClassBList, 
         opt => opt.MapFrom(src => Mapper.Map<IList<ClassA>, IList<ClassB>>(src.ClassAList))) 
      .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA)); 

    } 
} 

ist die Initialisierung

Mapper.Initialize(x => 
    { 
     x.AddProfile<ClassABaseToClassBBase>(); 
     x.AddProfile<ClassAToClassB>(); 
     x.AddProfile<ContainerAToContainerB>(); 
    }); 

und ein Diagramm einer Zusammenfassung alles (Rote Pfeile stellen AutoMapper-Zuordnungen dar.

enter image description here

Ich habe eine ContainerA-Instanz ContainerB zugeordnet. Dieses erste Szenario funktioniert ordnungsgemäß. Das Zielobjekt ist vollständig, wie es im Bild unten gefüllt:

enter image description here


Aber wenn ich diese Zuordnung

public class ClassBBaseToClassB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassBBase, ClassB>() 
      .ForMember(dest => dest.Text, opt => opt.Ignore()); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

Mapper.Initialize(x => 
    { 
     x.AddProfile<ClassABaseToClassBBase>(); 
     x.AddProfile<ClassAToClassB>(); 
     x.AddProfile<ClassBBaseToClassB>(); 
     x.AddProfile<ContainerAToContainerB>(); 
    }); 

enter image description here

das Ergebnis ist

hinzufügen enter image description here

Die Eigenschaften "Text" aller Elemente der Auflistung werden null. Wie Sie im Bild sehen können, ist die Eigenschaft "Text" des Objekts containerB.ClassB immer noch korrekt zugeordnet. Dies tritt nur bei Sammlungen auf. Ich weiß nicht, was passiert. Irgendwelche Hinweise?

Dank

+0

welche Ergebnisse erwarten Sie? – Cybermaxs

+0

Ich erwartete, dass alle Elemente von containerB.ClassBList vollständig gefüllt sind und keine Null-Eigenschaften haben. – peflorencio

Antwort

1

Hallo,

Versuchen Sie, die Zuordnung zwischen Behälter auf diese Weise zu ändern:

public class ContainerAToContainerB : Profile 
    { 
     protected override void Configure() 
     { 
      CreateMap<ContainerA, ContainerB>() 
       .ForMember(dest => dest.ClassBList,opt=>opt.MapFrom(src=>src.ClassAList)) 
       .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA)); 

     } 
} 
Verwandte Themen