You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:15:41