ibatis单元测试出现The error occurred while loading SqlMap -initialize type alias解决办法
2015-12-10 15:04
615 查看
ibatis项目运行正常,但是在单元测试时如果出现类似下面的异常:
The error occurred while loading SqlMap.
- initialize type alias
- The error occurred in <sqlMap embedded="XXX.XXX.xml,XXModel.XXX" xmlns="http://ibatis.apache.org/dataMapper" />.
- Check the XXX.XXX, XXModel.XXX.]
解决办法有两种:
1.将单元测试工程设为启动项即可。
2.如果单元测试工程不设置为启动项,那么就需要在调用ibatis方法之前,new 一个所需的实体对象。
解释:
追踪到ibatis内核代码中,发现IBatisNet.Common.Utilities.TypesResolver类中有一个LoadTypeByIteratingOverAllLoadedAssemblies方法,
它的作用就是用反射的方式为TypeAlias节点map出对应的自定义实体类。
所以,有一个解决办法是在你的project访问数据库之前,实例化一个typeAlias对应的类,AppDomain就会加载对应的程序集,加载typeAlias才不会报错。
The error occurred while loading SqlMap.
- initialize type alias
- The error occurred in <sqlMap embedded="XXX.XXX.xml,XXModel.XXX" xmlns="http://ibatis.apache.org/dataMapper" />.
- Check the XXX.XXX, XXModel.XXX.]
解决办法有两种:
1.将单元测试工程设为启动项即可。
2.如果单元测试工程不设置为启动项,那么就需要在调用ibatis方法之前,new 一个所需的实体对象。
解释:
追踪到ibatis内核代码中,发现IBatisNet.Common.Utilities.TypesResolver类中有一个LoadTypeByIteratingOverAllLoadedAssemblies方法,
它的作用就是用反射的方式为TypeAlias节点map出对应的自定义实体类。
private static Type LoadTypeByIteratingOverAllLoadedAssemblies(TypeAssemblyInfo typeInfo) { Type type = null; Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { type = assembly.GetType(typeInfo.TypeName, false, false); if (type != null) { return type; } } return type; }可以看到它用AppDomain.CurrentDomain.GetAssemblies()方法取得程序集,然后在这些程序集中按类名反射得到实体类型。问题就出在这里。如果你的实体类在一个不同于启动项目的程序集中,而且在你用ibatis访问数据库之前,这个程序集所包含的对象从来没有激活过。那么,这个方法是得不到实体类对应的程序集的,也就说你TypeAlias节点指向的实体类找不到,才会报如上的错误。而且要注意的是,所有的typeAlias会在第一次ibatis访问数据库的时候一次性加载,不管你这次有没有用到。
所以,有一个解决办法是在你的project访问数据库之前,实例化一个typeAlias对应的类,AppDomain就会加载对应的程序集,加载typeAlias才不会报错。
相关文章推荐
- express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(三)完结篇
- Windows MongoDB:搭建三节点 Replica Set 环境
- C#创建数据库及导入sql脚本的方法
- mysql主服务器 binlog_format 的 statement,row, mixed 三种格式对比。
- MySQL安装失败后操作
- 乐观锁和悲观锁
- mysql information_schema库
- MySQL查看数据库、表的占用空间大小
- SqlSever锁及存储过程优化
- C#获取Access数据库中的所有表名和列名
- mysql创建时间距离函数
- Oracle数据库10个小问题
- mysqldump: unknown option '--no-beep' 错误解决方法
- ubuntu上安装mongodb,并进行简单的增删改查操作
- Oracle 树操作(select…start with…connect by…prior)
- 数据库-identifying 与non-identifying realtionship 区别
- R中的SQL包--sqldf
- C#如何调用SQLServer写的函数
- Oracle内连接、外连接、右外连接、全外连接小总结
- SQL语法之初级增删改查