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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:43:00