使用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即可,如果你沒時間可直接下載我編譯好的,見本文中資源下載鏈接。