2017-09-27 2 views
1

Quelle Klassen:AutoMapper - map Eigenschaft Sammlung

public class ApplicationDriverFormVM 
{ 
    public ApplicationDriverAddressFormVM PresentAddress { get; set; } 
    public List<ApplicationDriverAddressFormVM> PreviousAddresses { get; set; } 
} 

public class ApplicationDriverAddressFormVM 
{ 
    [Required] 
    [StringLength(256)] 
    [Display(Name = "Address")] 
    public string Address { get; set; } 
    [Required] 
    [StringLength(256)] 
    [Display(Name = "City")] 
    public string City { get; set; } 
    //..... 
} 

Zielklassen:

public class ApplicationDriverDomain 
{ 
    public List<ApplicationDriverAddressDomain> Addresses { get; set; } 
} 

public class ApplicationDriverAddressDomain 
{ 
    public int Id { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    //.... 
    public bool IsPresentAddress { get; set; } 
} 

so möchte ich PresentAddress (ein Objekt) und PreviousAddresses (Sammlung) zu Adressen Eigentum (Sammlung zur Karte), wobei jedes Element die IsPresentAddress-Eigenschaft hat, die true sein muss, wenn es PresentAddress zugeordnet wurde und false für PreviousAddresses-zugeordnete Elemente. Ich versuche, solche Karte Grundregeln zu schreiben:

 CreateMap<ViewModels.ApplicationDriverFormVM, ApplicationDriverDomain>(); 
     CreateMap<ViewModels.ApplicationDriverAddressFormVM, ApplicationDriverAddressDomain>(); 

natürlich funktioniert es nicht richtig. Wie geht es?

Antwort

2

Dies kann mit den Erweiterungsmethoden ForMember durchgeführt werden.

Dies ist ein schneller und schmutziger Weg, um zu bekommen, was Sie wollen. Es macht eine neue kombinierte Liste von ApplicationDriverAddressFormVM, von der aus, aber wenn Sie die Dokumentation erkunden, können Sie wahrscheinlich etwas anmutiger finden.

Mapper.CreateMap<ApplicationDriverFormVM, ApplicationDriverDomain>() 
    .ForMember(dest => dest.Addresses, opt => opt.MapFrom(src => src.PreviousAddresses.Union(new List<ApplicationDriverAddressFormVM>() { src.PresentAddress }))); 

Mapper.CreateMap<ApplicationDriverAddressFormVM, ApplicationDriverAddressDomain>(); 

Nach einer weiteren Untersuchung fand ich die folgende Vorgehensweise. Es verwendet die Option ResolveUsing. Auch dies ist grob und verwendet nur die erste Funktionalität, die ich gefunden habe. Sie sollten ferner die IMemberConfigurationExpression Schnittstelle erkunden und sehen, was andere Optionen, die Sie

 Mapper.CreateMap<ApplicationDriverFormVM, ApplicationDriverDomain>() 
      .ForMember(dest => dest.Addresses, opt => opt.ResolveUsing(GetAddresses)); 

haben ...

static object GetAddresses(ApplicationDriverFormVM src) 
    { 
     var result = Mapper.Map<List<ApplicationDriverAddressDomain>>(src.PreviousAddresses); 
     foreach(var item in result) 
     { 
      item.IsPresentAddress = false; 
     } 
     var present = Mapper.Map<ApplicationDriverAddressDomain>(src.PresentAddress); 
     present.IsPresentAddress = true; 
     result.Add(present); 

     return result; 
    } 
+0

Danke. Aber es gibt ein (erstes) zusätzliches leeres Element (4 statt 3. Ich habe die aktuelle Adresse und 2 vorherige Adressen) in result. Warum? Außerdem, wie für die aktuelle Adresse und falsche für vorherige Adressen festgelegt werden? –

+0

@OlegSh Ich habe meine Antwort aktualisiert –

Verwandte Themen