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
相关产品推荐
相关产品推荐

