Automapper手动映射部分字段后自动映射其余字段报错排查
AutoMapper JToken映射配置错误排查
原有正常运行配置
以下是手动指定JToken到ModelOne的字段映射代码:
namespace App.Mappings { public class AutoMapperModelOne : Profile { public AutoMapperModelOne() { CreateMap<JToken, ModelOne>() .ForMember(dest => dest.id, opt => opt.MapFrom(src => src.SelectToken("application_id"))) .ForMember(dest => dest.activity_created, opt => opt.MapFrom(src => src.SelectToken("activity_created"))) .ForMember(dest => dest.source_url, opt => opt.MapFrom(src => src.SelectToken("source_url"))) .ForMember(dest => dest.is_transferred, opt => opt.MapFrom(src => src.SelectToken("is_transferred"))); } } }
需求与报错配置
想要实现的映射规则:
- 部分字段手动映射(如
id对应JToken的application_id) - 部分字段忽略(如
actualId) - 其余字段自动按属性名匹配JToken对应节点
编写的新配置触发Fluent Validator报错:
namespace App.Mappings { public class AutoMapperModelOne : Profile { public AutoMapperModelOne() { CreateMap<JToken, RAFApplication>() // 手动映射id字段 .ForMember(dest => dest.id, opt => opt.MapFrom(src => src.SelectToken("application_id"))) // 忽略actualId字段 .ForMember(dest => dest.actualId, opt => opt.Ignore()) // 自动映射其余所有字段 .ForAllMembers(opt => opt.MapFrom(src => src.SelectToken(opt.DestinationMember.Name))); } } }
错误原因
.ForAllMembers会对所有成员生效,直接覆盖你之前的手动配置和忽略规则:
- 原本手动映射的
id会被强制改为用id作为节点名去JToken查找,而非指定的application_id,导致映射值异常或缺失 - 标记为忽略的
actualId也会被执行映射逻辑,尝试从JToken中获取对应节点,违背忽略规则,进而触发Fluent Validator的校验报错
解决方案
改用.ForAllOtherMembers替代.ForAllMembers,它仅对未被手动配置(包括ForMember、Ignore)的成员生效,不会覆盖已有的映射规则:
修正后的代码:
namespace App.Mappings { public class AutoMapperModelOne : Profile { public AutoMapperModelOne() { CreateMap<JToken, RAFApplication>() // 手动映射id字段 .ForMember(dest => dest.id, opt => opt.MapFrom(src => src.SelectToken("application_id"))) // 忽略actualId字段 .ForMember(dest => dest.actualId, opt => opt.Ignore()) // 自动映射其余未配置的字段 .ForAllOtherMembers(opt => opt.MapFrom(src => src.SelectToken(opt.DestinationMember.Name))); } } }
内容的提问来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

