使用Automapper进行深层映射

Sex*_*yMF 28 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; }
    }
Run Code Online (Sandbox Code Playgroud)

这是我尝试自动化它的方式:

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

这是我得到的例外:

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

谢谢

All*_*est 36

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

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));
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的重要部分是Son属性到模型的映射,这就是强制使用第二个映射的原因(第2行). (5认同)

Max*_*xim 17

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

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


小智 11

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

  • 建议 ```.MapFrom()``` 的答案对我不起作用,但这确实有效。 (2认同)