2016-04-18 12 views
0

Nachdem sie AutoMapper (previous question) zu arbeiten, ich bin mit einem anderen Problem zu kämpfen (nahm es auf eine andere Frage, so dass der erste wäre nicht zu kompliziert sein) ...AutoMapper verschmelzenden Objekte Ausgabe

Ich habe die nächsten Klassen:

public class Model1 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime BirthDay { get; set; } 
    public int Gender { get; set; } 
    public string NickName { get; set; } 
}  
public class Model2 
{ 
    public bool Married { get; set; }  
    public int Children { get; set; } 
    public bool HasPet { get; set; } 
} 

public class Entity1 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime BirthDay { get; set; } 
    public int Gender { get; set; } 
}  
public class Entity2 
{ 
    public bool Married { get; set; }  
    public int Children { get; set; } 
    public bool HasPet { get; set; } 
    public string NickName { get; set; } 
} 

Diese Objekte sind schematisch ähnlich zu meinen ursprünglichen Objekten, außer den Namen und die Komplexität.

Und AutoMapper Konfigurationsklasse (genannt von Global.asax):

public class AutoMapperConfig 
{ 
    public static MapperConfiguration MapperConfiguration { get; set; } 

    public static void Configure() 
    { 
     MapperConfiguration = new MapperConfiguration(cfg => { 
      cfg.AddProfile<Out>(); 
      cfg.CreateMap<SuperModel, SuperEntity>(); 
     }); 
     MapperConfiguration.AssertConfigurationIsValid(); 
    } 
} 

public class Out: Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Model1, Entity1>(); 
     CreateMap<Model2, Entity2>() 
      .ForMember(dest => dest.NickName, opt => opt.Ignore()); 
     CreateMap<Model1, Entity2>() 
      .ForMember(dest => dest.Married, opt => opt.Ignore()) 
      .ForMember(dest => dest.Children, opt => opt.Ignore()) 
      .ForMember(dest => dest.HasPet, opt => opt.Ignore()); 
     CreateMap<SuperModel, SuperEntity>() 
      .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1)) 
      .ForMember(dest => dest.Entity2, opt => opt.MapFrom(src => src.Model2)); 
    } 
} 

Wenn ich das Objekt müssen umgewandelt werden, ich als nächstes tun (ich an dieser Stelle _superModel initialisiert und mit Daten gefüllt):

SuperEntity _superEntity = new SuperEntity(); 
AutoMapperConfig.MapperConfiguration.CreateMapper().Map<SuperModel, SuperEntity>(_superModel, _superEntity); 

Also, ich Karte Model1 zu Entity1 (Hexe ist in Ordnung), und auch Model2 zu Entity2 (Hexe ist auch in Ordnung, mit Ausnahme der Id-Eigenschaft, die ignoriert wird) .

Die Hauptobjekte SuperModel und SuperEntity sind ebenfalls zugeordnet und scheinen gut zu funktionieren.

Das Problem passiert, wenn ich Model1 zu Entity2 zuordnen, um die NickName (dachte der Rest der Eigenschaften werden ignoriert). Einige wie es immer ist null!

Irgendwelche Ideen?

+1

Wie werden Sie die Karten tun? –

+0

@ ArturoMenchaca Sie haben Recht, ich habe vergessen, es zu erwähnen. Bitte sehen Sie sich die Frage erneut an - Sie haben sie gerade bearbeitet. – neoselcev

Antwort

1

Das Problem ist, dass Sie eine Zieleigenschaft (Entity2) von Multiples Quelle Eigenschaftswerte (Children, Married und HasPet von Model2 und Nickname von Model1) zuordnen möchten.

Sie können Ihre Situation mit einer Custom Resolver oder mit Methode lösen.

mit benutzerdefinierten Resolver:

Sie haben eine Klasse inhärierende von ValueResolver zu erstellen, um festzulegen, wie Sie Entity2 von einem SuperModel abbildet:

public class CustomResolver : ValueResolver<SuperModel, Entity2> 
{ 
    protected override Entity2 ResolveCore(SuperModel source) 
    { 
     return new Entity2 
     { 
      Children = source.Model2.Children, 
      HasPet = source.Model2.HasPet, 
      Married = source.Model2.Married, 
      NickName = source.Model1.NickName 
     }; 
    } 
} 

Dann verwenden Sie es wie folgt aus:

CreateMap<SuperModel, SuperEntity>() 
    .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1)) 
    .ForMember(dest => dest.Entity2, opt => opt.ResolveUsing<CustomResolver>()); 

Verwenden von AfterMap:

Sie können Aktionen nach der Abbildung ausführen, so den Wert von Model1.Nickname zu Entity2.Nickname nach der Karte übergeben:

CreateMap<SuperModel, SuperEntity>() 
    .ForMember(dest => dest.Entity1, opt => opt.MapFrom(src => src.Model1)) 
    .ForMember(dest => dest.Entity2, opt => opt.MapFrom(src => src.Model2)) 
      .AfterMap((m, e) => e.Entity2.NickName = m.Model1.NickName); 
+0

Großartig, Danke! Ich werde es als erstes am Morgen versuchen (schon von meiner Arbeit).Hoffe das funktioniert :) damit ich endlich das Modul beenden und die Antwort abstimmen konnte :) – neoselcev