AutoMapper 9.0移除CreateMissingTypeMaps=true后ProjectTo报错求助
解决AutoMapper 9.0升级后ProjectTo映射缺失的问题
这个报错其实是AutoMapper 9.0版本的一个关键变化导致的——旧版本默认会自动创建缺失的类型映射(也就是你之前依赖的CreateMissingTypeMaps=true的行为),但从9.0开始,这个配置默认被关闭了,而且官方也更推荐显式配置映射关系,避免隐式映射带来的意外问题。
你可以按照下面的步骤来解决:
1. 显式配置类型映射
现在你需要在MapperConfiguration里手动添加源类型到myobject的映射规则,替换掉原来空的配置块。注意这里的源类型不能是object,得用你仓库返回的实际实体类型(比如假设你的Repo返回的是Product实体,就写Product):
MapperConfiguration config = new MapperConfiguration(cfg => { // 替换成你实际的源实体类型 cfg.CreateMap<YourActualSourceEntityType, myobject>(); // 如果源和目标属性名不匹配,还需要手动指定映射规则,比如: // cfg.CreateMap<YourActualSourceEntityType, myobject>() // .ForMember(dest => dest.MyObjectName, opt => opt.MapFrom(src => src.EntityName)); }); IMapper mapper = config.CreateMapper(); // 这里也要把source的类型从IQueryable<object>改成实际的实体类型IQueryable<YourActualSourceEntityType> IQueryable<YourActualSourceEntityType> source = _myRepo.GetResult(); List<myobject> dest = mapper.ProjectTo<myobject>(source).ToList();
2. 为什么之前的IQueryable<object>会有问题?
IQueryable<object>会丢失具体的类型信息,AutoMapper无法正确识别源类型的结构来生成映射表达式。所以最好让你的仓库方法GetResult()返回具体实体类型的IQueryable,而不是object类型。
3. 临时方案:重新开启自动创建映射(不推荐)
如果你暂时不想逐个配置映射,也可以在配置里重新开启CreateMissingTypeMaps,但这只是权宜之计,长期来看显式配置更清晰、更易于维护:
MapperConfiguration config = new MapperConfiguration(cfg => { cfg.CreateMissingTypeMaps = true; });
总的来说,AutoMapper 9.0的这个变化是为了让映射关系更透明,避免因为隐式映射导致的难以排查的问题,所以建议优先采用显式配置的方式。
内容的提问来源于stack exchange,提问作者Valdet Zabeli
相关产品推荐
相关产品推荐

