使用MemberList.None后AutoMapper仍尝试映射目标属性问题
AutoMapper MemberList.None 未生效的问题解答
问题场景
使用AutoMapper 12.0.1时,配置了两组映射:
- Staff → StaffDetailDto:显式映射StaffProperties属性
- StaffRole → StaffDetailDto:指定
MemberList.None,仅显式映射OrganizationRole属性
在服务层先将Staff映射为StaffDetailDto,再用StaffRole更新该Dto时,抛出映射错误,提示无法映射StaffProperties属性。疑问:MemberList.None是否应该只采用显式映射并忽略目标其他属性?
映射代码:
CreateMap<Staff, StaffDetailDto>() .ForMember(dest => dest.StaffProperties, opt => opt.MapFrom(src => JsonConvert.DeserializeObject<StaffProperties>(src.Properties))); CreateMap<StaffRole, StaffDetailDto>(MemberList.None) .ForMember(dest => dest.OrganizationRole, opt => opt.MapFrom((src, dest) => { return (src != null) ? src.OrganizationRole : (OrganizationRole?)null; }));
服务层代码:
var staffDetailDto = _mapper.Map<StaffDetailDto>(stf); // 从数据库获取staffRole staffDetailDto = _mapper.Map(staffRole, staffDetailDto);
异常信息:
Error mapping types. Mapping types: StaffRole -> StaffDetailDto Baseline.Models.StaffRole -> Baseline.Services.Models.Staff.StaffDetailDto Type Map configuration: StaffRole -> StaffDetailDto Baseline.Models.StaffRole -> Baseline.Services.Models.Staff.StaffDetailDto Destination Member: StaffProperties
原因说明
MemberList.None的作用是关闭成员映射验证——即AutoMapper不会因为目标/源存在未配置映射的成员而抛出验证错误,但它不会阻止AutoMapper的自动扁平化映射逻辑。
AutoMapper默认会尝试将源对象中与目标同名的成员自动映射到目标,当目标成员在源对象中找不到可映射的对应成员,且未显式配置忽略时,就会触发映射错误。你的场景中,StaffDetailDto的StaffProperties属性在StaffRole中没有对应的可映射成员,AutoMapper尝试自动映射该属性时失败,因此抛出异常。
解决方案
有两种方式可以解决这个问题:
1. 显式忽略单个未映射成员
在StaffRole → StaffDetailDto的映射配置中,显式忽略StaffProperties属性:
CreateMap<StaffRole, StaffDetailDto>(MemberList.None) .ForMember(dest => dest.OrganizationRole, opt => opt.MapFrom((src, dest) => { return (src != null) ? src.OrganizationRole : (OrganizationRole?)null; })) .ForMember(dest => dest.StaffProperties, opt => opt.Ignore());
2. 忽略所有未显式配置的成员
如果目标Dto中有多个不需要从StaffRole映射的成员,可以使用IgnoreAllOtherMembers()一次性忽略所有未显式配置的成员:
CreateMap<StaffRole, StaffDetailDto>(MemberList.None) .ForMember(dest => dest.OrganizationRole, opt => opt.MapFrom((src, dest) => { return (src != null) ? src.OrganizationRole : (OrganizationRole?)null; })) .IgnoreAllOtherMembers();
内容的提问来源于stack exchange,提问作者frosty
相关产品推荐
相关产品推荐

