AutoMapper嵌套对象扁平化不符合预期的问题及解决
AutoMapper嵌套对象扁平化映射问题及解决方法
尝试将嵌套对象进行扁平化处理,相关文档及Stack Overflow帖子均显示解决方案简单,但实际无法生效。
实体类定义
public class CRouteHold { public int HoldId { get; set; } public virtual Hold? Hold { get; set; } public bool? fhandstart { get; set; } public bool? ffootstart { get; set; } public bool? rhandstart { get; set; } public bool? rfootstart { get; set; } } public class Hold { public double? xpos { get; set; } }
目标扁平化DTO定义
public record CRouteHoldDto( int HoldId, bool fhandstart, bool ffootstart, bool rhandstart, bool rfootstart, double xpos );
尝试过的映射配置
- 简单非扁平化配置:注释DTO中的
xpos字段,仅映射CRouteHold的根属性,配置可正常生成CRouteHoldDto:
CreateMap<CRouteHold, CRouteHoldDto>();
遵循命名约定的扁平化配置:将DTO中的
xpos重命名为HoldXpos,AutoMapper可自动映射,无需修改配置。不遵循命名约定的
ForMember配置:希望DTO直接使用xpos字段名,尝试以下配置,但抛出“需要无参构造函数或可选参数”错误:
CreateMap<CRouteHold, CRouteHoldDto>() .ForMember(rh => rh.xpos, m => m.MapFrom(rh => rh.Hold.xpos));
- 使用
IncludeMembers的配置:添加Hold到CRouteHoldDto的映射,结果仍报错:
CreateMap<CRouteHold, CRouteHoldDto>() .IncludeMembers(s => s.Hold); CreateMap<Hold, CRouteHoldDto>(MemberList.None);
解决方案
感谢@LucianBargaoanu,最终有效的映射配置如下,只需为每个需要映射的属性添加ForCtorParam配置:
CreateMap<CRouteHold, CRouteHoldDto>() .ForCtorParam("xpos", m => m.MapFrom(s => s.Hold.xpos)) .ForCtorParam("otherproperty", m => m.MapFrom(s => s.Hold.otherproperty))
内容的提问来源于stack exchange,提问作者Gary Frewin
相关产品推荐
相关产品推荐

