【问题标题】:Deep level mapping using Automapper使用 Automapper 进行深度映射
【发布时间】:2013-03-11 09:23:47
【问题描述】:

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

 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 选项。参数名称: lambda表达式

谢谢

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

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

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

    【讨论】:

    • 这个答案的重要部分是 Son 属性到模型的映射,这就是强制使用第二个映射(第 2 行)的原因。
    【解决方案2】:
        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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 建议.MapFrom() 的答案对我不起作用,但确实如此。
      猜你喜欢
      • 2016-04-13
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 2017-02-14
      相关资源
      最近更新 更多