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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:33:25