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

Automapper 12版本使用ToLowerInvariant()时MapFrom测试失败求助

问题原因:AutoMapper 12的验证逻辑变更,并非bug

这是AutoMapper 12的功能变更,不是程序bug。在v11及更早版本中,当你用MapFrom把源对象的Email同时映射到目标对象的Email和UserName时,AutoMapper的源成员验证(MemberList.Source)会默认认定源的Email属性已被处理。但v12的验证逻辑更严格:它会检查源的每个属性是否存在对应的直接映射关联,当你手动用MapFrom覆盖默认的同名映射后,它无法自动识别源Email与目标Email的映射关系,进而判定源的Email属性未被映射,抛出未映射成员的错误。

解决方法

有两种简洁的解决方式:

方法一:明确忽略源Email属性的验证

既然已经手动处理了Email的映射逻辑,直接告知AutoMapper无需验证该源属性即可:

CreateMap<UserEditProfileViewModel, ApplicationUser>(MemberList.Source)
    .ForMember(dest => dest.Email, opts => opts.MapFrom(src => src.Email.ToLowerInvariant()))
    .ForMember(dest => dest.UserName, opts => opts.MapFrom(src => src.Email.ToLowerInvariant()))
    .ForSourceMember(src => src.Roles, opts => opts.DoNotValidate())
    // 新增该行,忽略源Email属性的验证
    .ForSourceMember(src => src.Email, opts => opts.DoNotValidate());

方法二:利用约定映射修改转换逻辑

如果不想添加忽略规则,可以先保留Email的默认同名映射,再单独修改其转换逻辑:

CreateMap<UserEditProfileViewModel, ApplicationUser>(MemberList.Source)
    // 基于默认同名映射,修改Email的转换逻辑
    .ForMember(dest => dest.Email, opts => opts.ConvertUsing(src => src.Email.ToLowerInvariant()))
    .ForMember(dest => dest.UserName, opts => opts.MapFrom(src => src.Email.ToLowerInvariant()))
    .ForSourceMember(src => src.Roles, opts => opts.DoNotValidate());

这里用ConvertUsing替代MapFrom,它会在默认映射的基础上修改转换规则,AutoMapper能识别到源Email已被处理,不会触发验证错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:01:18