AutoMapper - Deep level mapping

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

I am trying to map objects with multi-level members: these are the 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; }     } 

This is how I try automap it:

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

this is the exception that I get:

Expression 'dest => Convert(dest.Son.Id)' must resolve to top-level member and not any child object's properties. Use a custom resolver on the child type or the AfterMap option instead. Parameter name: lambdaExpression

Thanks

回答1:

This will work both for mapping to a new or to an existing object.

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)); 


回答2:

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

if it's getting more complex you can write a ValueResolver class, see example here- http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers



回答3:

duplicate from:https://stackoverflow.com/a/8944694/1586498

Mapper.CreateMap<DomainClass, Child>(); Mapper.CreateMap<DomainClass, Parent>()   .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id))   .ForMember(d => d.A, opt => opt.MapFrom(s => s.A))   .ForMember(d => d.Child,               opt => opt.MapFrom(s => Mapper.Map<DomainClass, Child>(s))); 

Thanks to: @justin-niessner



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!