升级AutoMapper后遇到的“Missing map”与“Missing type map configuration”问题
前几天发现 AutoMapper 3.3 的一个性能问题(详见:遭遇AutoMapper性能问题:映射200条数据比100条慢了近千倍),于是将 AutoMapper 升级至最新的 5.1.1 看是否也存在这个性能问题。
升级中想当然地将之前的map配置代码:
Mapper.CreateMap<AEntity, ADto>();
Mapper.CreateMap<BEntity, BDto>();
改为:
Mapper.Initialize(cfg => cfg.CreateMap<AEntity, ADto>());
Mapper.Initialize(cfg => cfg.CreateMap<BEntity, BDto>());
但是代码运行时在执行 Mapper.Map() 时出现下面的错误:
Missing type map configuration or unsupported mapping
在执行 ProjectTo() 时出现下面的错误:
System.InvalidOperationException: Missing map from AEntity to ADto.
Create using Mapper.CreateMap<AEntity, ADto>.
在 AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression...
当时百思不得其解,折腾了一段时间无果,就暂时放在一边。
今天在博问上发现有人遇到了同样的问题——求解AutoMapper映射类发生错误求解,于是解决这个问题的兴趣被激发,又开始折腾。
在折腾的过程中发现,如果不用 Mapper.Initialize() 这种静态的配置方式,改用下面的实例配置方式,就不会出现这个问题。
var config = new MapperConfiguration(cfg => cfg.CreateMap<A, B>());
var mapper = config.CreateMapper();
mapper.Map<List<B>>(list);
Mapper.Initialize() 理所当然地成了最大的嫌疑对象,于是从 GitHub 上签出 AutoMapper 的源代码一看 Mapper.Initialize() 的实现,恍然大悟。
public static void Initialize(Action<IMapperConfigurationExpression> config)
{
Configuration = new MapperConfiguration(config);
Instance = new Mapper(Configuration);
}
原来每次调用 Mapper.Initialize() 都会创建新的 Mapper 实例,也就是多次调用 Mapper.Initialize() 只有最后一次生效。
下面的配置代码中生效的只是第2行(BEntity到BDto的map),第1行(AEntity到ADto的map)没生效,从而出现前面所说的错误。
Mapper.Initialize(cfg => cfg.CreateMap<AEntity, ADto>());
Mapper.Initialize(cfg => cfg.CreateMap<BEntity, BDto>());
知道了原因,解决起来就手到擒来,改为下面的代码即可。
var cfg = new MapperConfigurationExpression();
cfg.CreateMap<AEntity, ADto>();
cfg.CreateMap<BEntity, BDto>();
Mapper.Initialize(cfg);
解决这个问题后,成功完成了 AutoMapper 的升级,然后验证了 AutoMapper 3.3 的性能问题在 AutoMapper 5.1.1 中不存在。
升级AutoMapper后遇到的“Missing map”与“Missing type map configuration”问题的更多相关文章
- 报错:Missing type map configuration or unsupported mapping
报错:Missing type map configuration or unsupported mapping □ 背景 当把View Model转换成Domain Model保存的时候,发生在Au ...
- 升级iOS10后http网页定位失效解决方案
最近我们在做项目时遇到这样一个新问题,用户在升级 iOS10 后,在 http 下使用 geolocation api 会报错,控制台输出 [blocked] Access to geolocatio ...
- ubuntu升级内核后vmware-player启动失败
在虚拟机软件中,vmware player是对硬件支持很好的,通过它可以很方便的使用网银.单片机开发等等工作.但是最近ubuntu每次升级内核后,vmware都会启动失败,提示:Before you ...
- 解决AndroidStudio升级版本后恢复初始化设置的问题
今天把AndroidStudio升级到1.5后发现所有的个性设置全变为初始化了.包括皮肤啊,字体大小.颜色啊,以及快捷键等等.一瞬间就懵了. 升级完后好像有一个弹窗就是提示是否要继续使用之前的配置的, ...
- JLINK固件丢失或升级固件后提示Clone的解决办法
J-LINK V8固件烧录指导 J-LINK 是使用过程中,如果内部固件意外损坏或丢失,请参考下面操作步骤说明,重新烧录JLINK固件. 安装固件烧录软件 请ATMEL官方网址下载AT91-ISP下载 ...
- 探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB
探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB 前言: 从Oracle 12c開始,引入了容器数据库的概念,能够实现数据库插拔操作,例如以下图: 如今我们 ...
- IDEA升级版本后界面出现变小,字体变细的问题解决
笔者在今天升级了最新版本的IDEA 2019后发现,该版本的IDEA出现了非常诡异的事情如下图: 升级版本后字体居然发生了变化(通过官方导入的我自己的settings文件)还是出现了问题. 问题解决方 ...
- Confluence 6 升级完成后的检查
这个页面中的文章将会为 Confluence 管理员为 Confluence 升级完成后 提供检查列表以确保 Confluence 的升级顺利完成.这个检查列表没有包含所有需要检查的错误,但是将会检查 ...
- 升级node后还是原来版本问题
解决升级node后,已经安装了最新的版本,但是默认的node版本不是最新版本还是当前版本. 最近遇到个错误:The engine node is incompatible with this modu ...
随机推荐
- android 异步加载框架 原理完全解析
一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...
- 开始研究tigase和android客户端的实现
2015.7.5. 昨晚总算把tigaase7.0的开发环境搭起来了.稍微看了下代码结构. 主要是auth,db,compnent,cluster,server,xmpp,这几块,准备先发点时间看看开 ...
- oracle创建密码文件的语句
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle entries=5;
- [译]关于iOS和OS X废弃的API你需要知道的一切
原文: Everything You Need to Know about iOS and OS X Deprecated APIs 如你所知,已废弃(Deprecated)的API指的是那些已经过时 ...
- C# 京东模拟登录小结
最近有需要模拟京东登录,在解决过程中遇到了一些问题,因此这里记录下来避免以后遇到同样的问题. 首先第一步需要做的是找到登录请求网址和关于请求所需的一些信息.这里可以用抓取工具或者直接用firebug或 ...
- ReferenceQueue<T>随笔
参考资料: ReferenceQueue食用手册 java引用食用手册 ReferenceQueue源代码里面很好的展示了java队列的实现思路, 以及多线程观察者的实现思路 多线程观察者实现思路: ...
- 探 寻 宝 藏--- DP
题目描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角.当然,迷宫中的通路不是平坦 ...
- 【OpenGL】如何绘制Shadow
背景 Shadow即阴影,它是光线被不透明物体遮挡而产生的黑暗区域,与光源的方向相反. 在Blender中编辑过程中没有Shadow,只有在经过渲染后才能显示.目前有一个基于Blender的项目,要求 ...
- [转]redis-cli的一些有趣也很有用的功能
本文转至:http://www.tuicool.com/articles/Yvqm2ev http://mdba.cn/category/redis/ redis-cli我们最常用的两个参数就是-h. ...
- python 版本升级(CentOS) 从2.6.6升级到2.7.6
安装必须的包 yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readli ...