使用Automapper进行深层映射

本文关键字:映射 Automapper 使用 | 更新日期: 2023-09-27 18:05:15

我正在尝试映射具有多级成员的对象:这些是类:

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

这就是我尝试自动映射的方式:

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

这是我得到的例外:

表达式"dest=>Convert(dest.Son.Id("必须解析为顶级成员,而不是任何子对象的属性。在上使用自定义冲突解决程序子类型或AfterMap选项。参数名称:lambdaExpression

感谢

使用Automapper进行深层映射

这将适用于映射到新对象或现有对象。

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

如果它变得越来越复杂,您可以编写ValueResolver类,请参阅此处的示例-https://docs.automapper.org/en/stable/Custom-value-resolvers.html

使用ForPath而不是ForMember&它的作用就像魔术一样。

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

它工作正常