首页 > 解决方案 > AutoMapper 展平

问题描述

我需要使用 AutoMapper 将源映射到目标。类型结构如下所示:

Source {
  public string SourceField1;
  public string SourceField2;
  public InnerSource Inner;
}

InnerSource {
  public string InnerSourceField3;
  public string InnerSourceField4;
}

Destination {
  public string DestinationField1;
  public string DestinationField2;
  public string DestinationField3;
  public string DestinationField4;
}

我的解决方案看起来像:

CreateMap<Source, Destination>()
  .ForMember(dest => dest.DestinationField1, opt => opt.MapFrom(src => src.SourceField1))
  .ForMember(dest => dest.DestinationField2, opt => opt.MapFrom(src => src.SourceField2))
  .AfterMap((src, dest, context) => context.Mapper.Map(src.Inner, dest));

CreateMap<InnerSource, Destination>()
  .ForMember(dest => dest.DestinationField3, opt => opt.MapFrom(src => src.InnerSourceField3))
  .ForMember(dest => dest.DestinationField4, opt => opt.MapFrom(src => src.InnerSourceField4))

所有这些东西似乎都有效,但不适用于 EF 和 ProjectTo 扩展方法,因为 AfterMap 与 EF 不“兼容”。

所以我的问题是如何使用 EF 进行这项工作?我应该使用一些解决方法还是有另一种方法可以在没有 AfterMap 的情况下映射这种类型结构?

标签: c#automapper

解决方案


        CreateMap<Source, Destination>().IncludeMembers(s => s.Inner)
            .ForMember(dest => dest.DestinationField1, opt => opt.MapFrom(src => src.SourceField1))
            .ForMember(dest => dest.DestinationField2, opt => opt.MapFrom(src => src.SourceField2));
        CreateMap<InnerSource, Destination>()
            .ForMember(dest => dest.DestinationField3, opt => opt.MapFrom(src => src.InnerSourceField3))
            .ForMember(dest => dest.DestinationField4, opt => opt.MapFrom(src => src.InnerSourceField4));

另外你应该知道你可以拒绝前缀


推荐阅读