web-dev-qa-db-fra.com

Cartographie en profondeur avec Automapper

J'essaie de mapper des objets avec des membres multi-niveaux: Ce sont les classes:

 public class Father
    {
        public int Id { get; set; }
        public Son Son { get; set; }
    }

    public class FatherModel
    {
        public int Id { get; set; }
        public int SonId { get; set; }
    }

    public class Son
    {
        public  int Id { get; set; }
    }

Voici comment j'essaie d'automatap it:

 AutoMapper.Mapper.CreateMap<FatherModel , Father>()
                      .ForMember(dest => dest.Son.Id, opt => opt.MapFrom(src => src.SonId));

c'est l'exception que je reçois:

L'expression 'dest => Convert (dest.Son.Id)' doit être résolue au niveau supérieur. membre et non les propriétés d'un objet enfant. Utilisez un résolveur personnalisé sur le type enfant ou l'option AfterMap à la place. Le nom du paramètre: lambdaExpression

Merci

26
Shazam

Cela fonctionnera à la fois pour le mappage vers un objet nouveau ou existant.

Mapper.CreateMap<FatherModel, Father>()
    .ForMember(x => x.Son, opt => opt.MapFrom(model => model));
Mapper.CreateMap<FatherModel, Son>()
    .ForMember(x => x.Id, opt => opt.MapFrom(model => model.SonId));
33
Allrameest
    AutoMapper.Mapper.CreateMap<FatherModel, Father>()
                     .ForMember(x => x.Son, opt => opt.ResolveUsing(model => new Son() {Id = model.SonId}));

si cela devient plus complexe, vous pouvez écrire une classe ValueResolver, voir exemple ici- http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers

17
Maxim

Utilisez ForPath plutôt que ForMember & Cela fonctionne comme par magie.

0
Teja Swaroop