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

