使用Automapper进行深层映射

时间:2013-03-21 17:58:18

标签: c# automapper

我正在尝试使用多级成员映射对象: 这些是类:

 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 =&gt;转换(dest.Son.Id)'必须解析为顶级   成员而不是任何子对象的属性。使用自定义解析器   而是改为子类型或AfterMap选项。参数名称:   lambdaExpression

由于

3 个答案:

答案 0 :(得分:33)

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

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

答案 1 :(得分:17)

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

如果它变得越来越复杂,你可以写一个ValueResolver类,参见这里的例子 - http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers

答案 2 :(得分:2)

使用ForPath而不是ForMember,它的工作原理就像魔术。