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

AutoMapper如何保留目标对象中源对象不存在的属性值?

解决AutoMapper映射时保留目标对象原有属性值的问题

当将DTOPage映射到从数据库加载的PDFPage模板时,PDFPage中原有的X、Y、Width、Height等属性值被重置为默认值(或null),即使配置了UseDestinationValue()也无效。

核心问题:映射方法调用错误

你之前的配置本身没问题,但大概率是调用了创建新对象的Map方法,而非更新已有对象的重载方法。AutoMapper只有在传入已有目标对象时,才会应用UseDestinationValue()保留原有属性值。

正确的映射调用方式

// 从数据库加载已有的PDFPage模板实例
var existingPdfPage = _dbContext.PDFPages.FirstOrDefault(p => p.Id == templateId);

// 使用双参数Map方法,将DTOPage的数据更新到已有PDFPage对象上
_mapper.Map(dtoPage, existingPdfPage);

优化映射配置

无需逐个属性配置UseDestinationValue(),可以用ForAllOtherMembers批量处理所有未明确配置的属性,简化代码:

CreateMap<DTOPage, PDFPage>()
    // 明确配置需要映射的属性(比如Fields集合,需确保已有DTOField到Field的映射)
    .ForMember(dest => dest.Fields, opt => opt.MapFrom(src => src.Fields))
    // 对所有其他目标属性,保留原有值
    .ForAllOtherMembers(opt => opt.UseDestinationValue());

补充说明

  • 如果你的PDFPage属性是可空值类型(比如int? Width),未配置映射时AutoMapper默认会尝试将源对象的对应属性(源中不存在则为null)赋值给目标,这就是原有值被覆盖的原因。UseDestinationValue()会强制跳过这个赋值,保留目标对象的原有值。
  • 确保已正确配置DTOField到Field的映射,否则Fields集合的映射会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:25:24