使用Automapper进行深层映射

41

我想要映射具有多级成员的对象: 这些是类:

 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

谢谢。


1
使用最新的AutoMapper映射嵌套属性时,只需使用ForPath而不是ForMember即可。它非常好用。 - Ε Г И І И О
4个回答

47

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

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

7
答案的重要部分是将 Son 属性映射到模型中,这就强制使用第二个映射(第2行)。 - Steve

21

13

使用ForPath而不是ForMember,它像魔术一样有效。


2
建议使用 .MapFrom() 的答案对我没有用,但是这个方法有效。 - derekbaker783

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

它正常工作


根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接