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

