如何配置AutoMapper避免覆盖映射中未定义的属性?
解决AutoMapper映射时保留原有字段值的问题
问题分析
两次映射后Phone字段被置为null,原因是第二次用EmployeeOtherAddressDto映射到Employee对象时,AutoMapper默认会处理所有匹配成员(即使源成员为null或不存在),覆盖了之前的Phone值。需要让映射仅更新Address1和Address2,保留Phone的原有值。
解决方案
修改EmployeeOtherAddressDto到Employee的映射配置,明确忽略Phone字段,映射时就不会修改该字段的原有值:
CreateMap<EmployeeOtherAddressDto, Employee>() .ForMember(dest => dest.Address1, options => options.MapFrom(src => src.Address1)) .ForMember(dest => dest.Address2, options => options.MapFrom(src => src.Address2)) .ForMember(dest => dest.Phone, options => options.Ignore()) // 忽略Phone字段,保留原有值 .ValidateMemberList(MemberList.None) .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));
原理说明
.ForMember(dest => dest.Phone, options => options.Ignore())告诉AutoMapper映射时完全跳过Phone字段,不做任何修改,自然保留第一次映射后的值。- 原有的
.ForAllMembers条件依然生效,确保Address1和Address2只有在源成员不为null时才会覆盖目标值。
修改后,第二次映射只会更新Address1和Address2,Phone字段会保持第一次映射的"0000000000"值,符合预期。
内容的提问来源于stack exchange,提问作者Francis Peter
相关产品推荐
相关产品推荐

