使用Entity Framework Profiler和MiniProfiler会导致Z.EntityFramework.Plus.EF6识别数据库类型发生错误,从而导致生成的SQL不能正常执行,根本原因推测是“Entity Framework Profiler和MiniProfiler”重写了EF的DBContext或Z.EntityFramework.Plus.EF6获取程序集时出错,而“Z.EntityFramework.Plus.EF6”是根据实现DBContext类命名空间、名称来判断数据库类型的,所以导致识别出错的问题,以MiniProfiler举例,如下图:
经过多次尝试,可以这样解决冲突:下载Z.EntityFramework.Plus.EF6源码,把判断数据库类型的几件代码如下:
bool isMySql = command.GetType().FullName.Contains("MySql");
var isSqlCe = command.GetType().Name == "SqlCeCommand";
var isOracle = command.GetType().Namespace.Contains("Oracle");
var isPostgreSQL = command.GetType().Name == "NpgsqlCommand";
var isSQLite = command.GetType().Namespace.Contains("SQLite");
var isHana = command.GetType().Namespace.Contains("Hana");
上面是原代码,需要调整,我是像这样调整的:
bool isMySql = command.GetType().FullName.Contains("MySql") || ConfigurationManager.AppSettings["DBTYPE"]== "MySql";
var isSqlCe = command.GetType().Name == "SqlCeCommand" || ConfigurationManager.AppSettings["DBTYPE"] == "SqlCeCommand";
var isOracle = command.GetType().Namespace.Contains("Oracle") || ConfigurationManager.AppSettings["DBTYPE"] == "Oracle";
var isPostgreSQL = command.GetType().Name == "NpgsqlCommand" || ConfigurationManager.AppSettings["DBTYPE"] == "NpgsqlCommand";
var isSQLite = command.GetType().Namespace.Contains("SQLite") || ConfigurationManager.AppSettings["DBTYPE"] == "SQLite";
var isHana = command.GetType().Namespace.Contains("Hana") || ConfigurationManager.AppSettings["DBTYPE"] == "Hana";
在尽量不改变原代码的情况下加一个参数,毕竟正式部署后项目中不会再包含Entity Framework Profiler和MiniProfiler,原代码是可以正常判断数据库类型的,所以原有的代码应当保留,配置文件中添加参数,如下:
<appSettings>
<!--
数据库类型,用于开发阶段兼容Z.EntityFramework.Plus.EF6判断数据库类型,
取值:MySql|Oracle|SQLite|SqlCeCommand|Hana|NpgsqlCommand
-->
<add key="DBTYPE" value="MySql"/>
</appSettings>
如果确认项目中不会用其他库,比如只用mysql,像这样暴力调整也是可以的:
bool isMySql = true;//假如你项目用的mysql数据库
var isSqlCe = false;
var isOracle = false;
var isPostgreSQL = false;
var isSQLite = false;
var isHana = false;
调整完代码重新编译发部原项目,引用新的DLL即可,如果你没时间可直接下载我编译好的,见本文中资源下载链接。