c# - 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 的情况下映射这种类型结构?
解决方案
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));
另外你应该知道你可以拒绝前缀
推荐阅读
- java - In java constructor and main which one will execute first?
- sql-server - 如何在不使用 Visual Studio 中的 EF 的情况下将数据从一个表“连接”到另一个表是否可以使用现有控制器?
- reactjs - 如何在 Gauge 的 valueText 中设置不同的 valueTextColor
- ios - 如何在firebase中进行类似sql的查询?
- java - 小吃店设置操作文本始终返回大写字母
- html - Angular Flex 是否可以有多个粘性列?
- java - 如何在验证侦听器事件 verifyText(...) 上获取选定的文本小部件文本
- android - 基于画布的自定义进度视图不圆
- c# - 在 ADO.NET 中密封数据提供程序类(如 SqlConnection、SqlCommand 等)背后的原因是什么?
- selenium - 单击添加按钮后如何在同一元素中输入不同的文本?