Automapper重名字段映射报错(缺失类型映射配置/不支持映射)
问题根因
你调用ReverseMap()的时候,AutoMapper默认只会做简单的属性名反向匹配:你正向配置的是UserEntity.ScopeKey → UserModel.Scope,但反向映射时AutoMapper并不会自动推导UserModel.Scope → UserEntity.ScopeKey,反而会优先匹配UserEntity上同名的Scope属性(类型为ScopeEntity),尝试把string类型的UserModel.Scope直接映射到这个属性,自然就触发了类型不匹配的异常。
更优雅的实现方案
方案1:反向映射规则聚合配置
不需要单独写新的CreateMap,直接在ReverseMap()后追加反向映射规则,所有相关映射逻辑统一维护:
var config = new MapperConfiguration(cfg => { cfg.CreateMap<UserEntity, UserModel>() // 正向映射规则:UserEntity.ScopeKey 映射到 UserModel.Scope .ForMember(dest => dest.Scope, opts => opts.MapFrom(src => src.ScopeKey)) // 开启反向映射 .ReverseMap() // 反向映射规则:UserModel.Scope 映射到 UserEntity.ScopeKey .ForMember(dest => dest.ScopeKey, opts => opts.MapFrom(src => src.Scope)) // 忽略UserEntity上的Scope导航属性,避免类型转换报错 .ForMember(dest => dest.Scope, opts => opts.Ignore()); });
这个方案的优势是所有和UserEntity、UserModel相关的映射规则都聚合在同一段配置里,可读性和可维护性更强,不会影响其他类的映射逻辑。
方案2:全局忽略虚拟属性(适配EF/EF Core场景)
如果你的项目用EF/EF Core做数据层,绝大多数导航属性都会加virtual关键字,可以全局配置不映射这类属性,不需要每个映射都手动写Ignore:
var config = new MapperConfiguration(cfg => { // 全局规则:不映射所有带virtual修饰的属性 cfg.ShouldMapProperty = propInfo => !propInfo.GetGetMethod().IsVirtual; cfg.CreateMap<UserEntity, UserModel>() .ForMember(dest => dest.Scope, opts => opts.MapFrom(src => src.ScopeKey)) .ReverseMap(); });
这个方案适合项目中大量存在带导航属性的实体类的场景,可以大幅减少重复的忽略配置。
内容的提问来源于stack exchange,提问作者Christopher Townsend
相关产品推荐
相关产品推荐

