2017-09-19 2 views
1

permet de dire que j'ai une entité EF comme ceci:Automapper - types d'entités de cartographie aux modèles de vue imbriqués

public class Person 
{ 
    public string Name { get; set; } 
    public string Psuedonym { get; set; } 
    public bool HasPsuedonym { get; set; } 
} 

De cette entité que je veux la carte à un viewmodel qui ressemble à ceci:

public class PersonViewModel 
{ 
    public string Name { get; set; } 
    public PsuedonymViewModel { get; set; } 
} 

qui contient cette autre vue modèle:

public class PsuedonymViewModel 
{ 
    public string Psuedonym { get; set; } 
    public bool HasPsuedonym { get; set; } 
} 

Quels applications dois-je configurer?

J'ai une configuration de mappage générique qui crée les correspondances suivantes:

Person > PersonViewModel - memberlist.dest 
PersonViewModel > Person - memberlist.source 

PsuedonymViewModel > Person - memberlist.dest 
Person > PsuedonymViewModel - memberlist.source 

Les applications génériques carte ne les propriétés qui sont présentes dans la source ou de destination, selon la façon dont la cartographie est pour que je don Il ne faut pas ajouter tout un tas d'ignorés manuellement pour les propriétés qui ne correspondent pas.

Quand j'ai cette configuration, automapper dit:

AutoMapper.AutoMapperConfigurationException: The following property on MyApplication.PsuedonymViewModel cannot be mapped: 
    Psuedonym 
Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type MyApplication.PsuedonymViewModel. 
Context: 
    Mapping to property Psuedonym from System.String to MyApplication.PsuedonymViewModel 

Je comprends ce message lorsque vous essayez de la carte à PsuedonymViewModel de l'entité Person il n'y a pas de correspondance string-Psuedonym. Je peux résoudre cela avec une cartographie manuelle comme ceci:

CreateMap<string, PsuedonymViewModel>() 
    .ForMember(x => x.HasPsuedonym, opt => opt.Ignore()) 
    .ForMember(x => x.Psuedonym, opt => opt.MapFrom(y => y)); 

Alors que Mappe la propriété Psuedonym je dois ignorer la propriété HasPsuedonym qui est pas ce que je suis après, mais parce qu'il est la cartographie de string il n'y a pas tout ce que je peux travailler avec.

J'ai l'impression d'avoir fait quelque chose de fondamentalement faux ici, mais je ne peux pas le comprendre, toutes les pensées ont été grandement appréciées.

Répondre

2

Comme vous utilisez Person pour construire PsuedonymViewModel ainsi que PersonViewModel vous devez construire les correspondances, et mapping objet racine pointer juste pour construire la propriété du même objet source:

cfg.CreateMap<Person, PsuedonymViewModel>(); 
cfg.CreateMap<Person, PersonViewModel>() 
    .ForMember(x=>x.Psuedonym, m=>m.MapFrom(p=>p)); 
+0

Ceci est correct, à la fin, j'ai ajouté une interface au modèle Psuedonyme que je pourrais utiliser pour identifier les propriétés qui nécessitaient un mappage racine tel que décrit. – dougajmcdonald