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

AutoMapper从接口映射实体类遇未映射成员断言异常求助

AutoMapper 13.0.1 接口映射断言校验失败问题解决

问题场景

以下代码中,使用AutoMapper 13.0.1尝试从只读属性接口IGroup映射到实体GroupEF:

public interface IGroup
{
    string Name { get; /* set; 加setter后断言正常 */ }
    string Value { get; /* set; 加setter后断言正常 */ }
}

public class Group : IGroup
{
    public string Name { get; set; }
    public string Value { get; set; }
}

public class GroupEF
{
    public string Name { get; set; }
    public string Value { get; set; }
}

// 映射配置
CreateMap<Group, GroupEF>();
CreateMap<IGroup, GroupEF>().Include<Group, GroupEF>(); // 加不加Include不影响报错

调用configuration.AssertConfigurationIsValid()时,抛出**“发现未映射成员(Name, Value)”**异常:

  • 给IGroup的属性添加set访问器后,断言校验通过
  • 移除断言语句,映射功能完全正常,仅校验环节报错

原因

AutoMapper 13.x的配置断言校验逻辑默认会检查源属性是否具备可写性,哪怕映射过程只需要读取源属性的值。但实际映射时,仅需源属性的get访问器就能完成值传递,所以移除断言后映射能正常工作。

解决办法

1. 针对单个映射关闭源成员可写性校验(推荐)

在IGroup到GroupEF的映射配置中,添加忽略源成员检查的规则,既保留断言的其他校验能力,又跳过不必要的可写性检查:

CreateMap<IGroup, GroupEF>()
    .Include<Group, GroupEF>()
    .ForAllMembers(opt => opt.IgnoreSourceMemberCheck());

如果需要更精准控制,也可以单独指定属性:

CreateMap<IGroup, GroupEF>()
    .Include<Group, GroupEF>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
    .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Value))
    .ForAllMembers(opt => opt.IgnoreSourceMemberCheck());

2. 全局关闭源成员可写性校验

如果项目中有大量只读接口映射的场景,可全局配置跳过该校验:

var configuration = new MapperConfiguration(cfg =>
{
    // 全局关闭源成员可写性校验
    cfg.ShouldValidateSourceMember = _ => false;
    
    // 其他映射配置
    cfg.CreateMap<Group, GroupEF>();
    cfg.CreateMap<IGroup, GroupEF>().Include<Group, GroupEF>();
});

3. 给接口添加空setter(不推荐)

给IGroup的属性添加空set访问器,仅满足校验要求,但违背接口只读属性的设计初衷:

public interface IGroup
{
    string Name { get; set; }
    string Value { get; set; }
}

验证

配置完成后,调用configuration.AssertConfigurationIsValid()不再抛出异常,同时映射功能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:12:57