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

AutoMapper多源映射异常:同一目标对象仅部分属性完成赋值

问题描述

尝试将多类型的SourceCar模型映射至DestinationCar模型时,遇到跨源映射问题:DestinationDriverInfo的两个属性NumberOfYearsDriving和NumberOfClaims需同时赋值,但目前仅NumberOfYearsDriving有值,NumberOfClaims始终为空。

核心模型与映射配置

// 源模型(不可修改)
public class SourceCar
{
    public int Id { get; set; }
    public SourceDriverInfo DriverInfo { get; set; }
    public SourceClaimsInfo ClaimsInfo { get; set; }
}

public class SourceDriverInfo
{
    public int NumberOfYearsDriving { get; set; }
}

public class SourceClaimsInfo
{
    public int NumberOfClaims { get; set; }
}

// 目标模型
public class DestinationCar
{
    public int Id { get; set; }
    public DestinationDriverInfo DriverInfo { get; set; }
}

public class DestinationDriverInfo
{
    public int NumberOfYearsDriving { get; set; }
    public int NumberOfClaims { get; set; }
}

// 初始映射配置
var configuration = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<SourceCar, DestinationCar>();
    cfg.CreateMap<SourceDriverInfo, DestinationDriverInfo>();
    cfg.CreateMap<SourceClaimsInfo, DestinationDriverInfo>();
});

结果对比

  • 预期:DestinationDriverInfo的两个属性均被填充
  • 实际:仅NumberOfYearsDriving从SourceDriverInfo映射成功

解决方案

方式1:显式组合属性映射

直接在主映射中手动拼接两个源的属性值到目标对象:

var configuration = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<SourceCar, DestinationCar>()
        .ForMember(dest => dest.DriverInfo, opt => opt.MapFrom(src => new DestinationDriverInfo
        {
            NumberOfYearsDriving = src.DriverInfo.NumberOfYearsDriving,
            NumberOfClaims = src.ClaimsInfo.NumberOfClaims
        }));
});

方式2:复用已有映射规则(AfterMap补充)

如果需要保留SourceDriverInfo和SourceClaimsInfo的独立映射逻辑,可通过AfterMap二次映射补充属性:

var configuration = new MapperConfiguration(cfg =>
{
    // 保留原有子对象映射规则
    cfg.CreateMap<SourceDriverInfo, DestinationDriverInfo>();
    cfg.CreateMap<SourceClaimsInfo, DestinationDriverInfo>();
    
    cfg.CreateMap<SourceCar, DestinationCar>()
        .ForMember(dest => dest.DriverInfo, opt => opt.MapFrom(src => src.DriverInfo))
        .AfterMap((src, dest, ctx) => 
        {
            // 用ClaimsInfo补充DriverInfo的剩余属性
            ctx.Mapper.Map(src.ClaimsInfo, dest.DriverInfo);
        });
});

原理说明

AutoMapper默认只会匹配与目标属性直接对应的单个源属性映射规则(此处即SourceCar.DriverInfo→DestinationDriverInfo),不会自动合并多个源的映射。通过显式组合或二次映射,可将两个源的属性值合并到同一目标对象中。

内容的提问来源于stack exchange,提问作者Padawan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:13:15