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

