Z.EntityFramework.Plus.EF6兼容Entity Framework Profiler和MiniProfiler


使用Entity Framework ProfilerMiniProfiler會導致Z.EntityFramework.Plus.EF6識別數據庫類型發生錯誤,從而導致生成的SQL不能正常執行,根本原因推測是“Entity Framework ProfilerMiniProfiler”重寫了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 ProfilerMiniProfiler,原代碼是可以正常判斷數據庫類型的,所以原有的代碼應當保留,配置文件中添加參數,如下:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章