VS2019 +MySQL+EntityFramework 使用配置與坑點避免隨記
- 2021 年 8 月 9 日
- 筆記
一、安裝運行環境
- 首先我們到mysql的官方網站上下載 mysql-installer-community-8.0.26.0 ,或者其他特定版本,通過它我們可以先將 mysql-for-visualstudio 與 mysql-connector-net 安裝好。
- 然後通過NuGet 安裝 MySql.Data.EntityFramework ,安裝時 VS 將會自動安裝其他相關依賴。
- 注意:第一個坑點來了,我們要保證MySql.Data 、MySql.Data.EntityFramework 一定要與 mysql-connector-net 的版本一致,但同時我們還需保證其版本與 VS2019 程式目錄「Microsoft Visual Studio\2019\Professional\Common7\IDE\PrivateAssemblies」 底下 MySql.Data 、MySql.Data.EntityFramework 保持一致,否則在開發創建實體模型時將會出現閃退現象。
我使用的版本是 8.0.18.0 版的。
二、配置文件坑點避免
在完成以上運行環境的安裝後,我們需要注意下 App.config 內的配置。
當我在 VS 上調試程式時一切都是那麼完美,沒問題。OK,讓人炸裂的問題來了。什麼問題呢?
我將程式打包拿到其他電腦安裝。崩……,資料庫連接失敗。報出以下錯誤資訊
System.ArgumentException: 具有固定名稱「MySql.Data.MySqlClient」的 ADO.NET 提供程式未在電腦或應用程式配置文件中註冊或無法載入。有關詳細資訊,請參閱內部異常。 ---> System.ArgumentException: 找不到請求的 .Net Framework Data Provider。可能沒有安裝。
在 System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName)
在 System.Data.Entity.Infrastructure.DependencyResolution.DefaultProviderFactoryResolver.GetService(Type type, Object key, Func`3 handleFailedLookup)
--- 內部異常堆棧跟蹤的結尾 ---
什麼情況,怎麼會報這個錯誤?調試運行的時候不是很正常么,怎麼到別的地方就崩了?
於是我想了想,是不是運行環境的問題。於是我將 mysql-connector-net 安裝在了出問題的電腦上,問題解決了。
但,這不是我想要的結果,畢竟我在做 Sqlite 等其他資料庫的開發時可沒有這樣,還需要在客戶機再安裝連接器的。是否是哪裡配置有問題?
於是內事不決問度娘,外事不決問Google。在Google無法訪問的條件下,我找了大部分,都是說在 App.config 文件中添加以下程式碼
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.18.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
然並卵!!! 當我在開發環境內增加了上面的配置程式碼,原本開發環境能運行的程式也出現了資料庫不能連接的其他錯誤,而客戶機上也仍然不能使用。
當我在安裝 mysql-connector-net 後,沒修改配置文件的時候,客戶機能使用,說明在安裝 mysql-connector-net 時,它將某些配置參數寫入了某些全局參數文件里去了。
經過安裝 mysql-connector-net 的前後分析,我發現,它會在下圖的 machine.config 寫入全局參數。
而我們需要在 App.config 文件中增加的配置就是它在 machine.config 中寫入的資訊:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="6.7.4.0" newVersion="8.0.18.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="MySql.Data.Entity" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="6.7.4.0" newVersion="8.0.18.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.data>
<DbProviderFactories>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.18.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
當我們在未安裝 mysql-connector-net 的客戶機中的App.config 中寫入上面參數後,問題解決了。資料庫連接上了,程式能正常運行了。
- 注意,坑點又來了,我們的開發環境增加上面的配置後,會報錯失敗。而這個錯誤其實是因為我們安裝了 mysql-connector-net 導致全局配置與程式配置的重複載入造成的。所以我們應該讓程式運行時移除一次配置的參數節點。
我們需要增加移除節點
<remove invariant="MySql.Data.MySqlClient" />
具體位置如下:
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.18.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
至此,本次配置算是圓滿結束了。原創不易,轉載請註明出處。