某项目
运行环境:net core 2.2
数据库:mysql
引用:Surging.Hero,一个经过某人改造的Surging框架。不知为何,这个Surging.Hero的github repo已经被删。
在开发过程中,碰到了各种各样的坑,今记述如下:
一、条件查询结果完全错误
该框架内置了一个Dapper的扩展组件,支持linq查询。但是不知为何,查询的结果一直为空。用Profiler一查,发现select的where里,部分字段的字段名和值错位。例如:
1 DateTime now=DateTime.Now; 2 3 Table.Where(v=>v.A==1&&v.Date=now&&v.B="City");
最后生成的结果居然是
1 where A=1 AND Date is null AND B='2019-12-20'
最后发现是Surging.Hero的作者不知从哪里扒来个根据linq生成表达式树的类,而这个类有bug,导致生成的sql错误。解决方案只能是自己写sql.
二、BadImageFormatException
三台机器:开发机A,服务器B,服务器C
编译的代码用dotnet xxxx.dll运行,在A和B上一切正常,但是在C上报BadImageFormatException异常。
通过出错信息得知错误点在Surging.Core.CPlatform\Module\ModuleProvider.cs的Initialize方法。加了点log语句后发现是在加载AutoMapperModule时异常的。
这个异常一般和32/64位的dll有关。但是查看项目设置未发现端倪。而且直接在C上编译也不行。
纠结几天后怀疑是框架引用的AutoMapper太旧。但是由于最新版AutoMapper改了不少东西,在框架源码里引入最新版AutoMapper后直接编译出错。这时注意到框架引用了AutoMapper.Attributes。AutoMapper.Attributes的最新版是6.0.1,引用了AutoMapper 5.0.2。于是去翻AutoMapper的github,发现AutoMapper7.0.0的Release Note里有一条,加入对net standard 2.0的支持。
于是事情清楚了。
在Surging.Core.AutoMapper里引入AutoMapper7.0.1,搞定收工。