1. 程式人生 > 其它 >VS2019 +MySQL+EntityFramework 使用配置與坑點避免隨記

VS2019 +MySQL+EntityFramework 使用配置與坑點避免隨記

一、安裝執行環境

  1. 首先我們到mysql的官方網站上下載 mysql-installer-community-8.0.26.0 ,或者其他特定版本,通過它我們可以先將 mysql-for-visualstudio 與 mysql-connector-net 安裝好。
  2. 然後通過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 等其他資料庫的開發時可沒有這樣,還需要在客戶機再安裝聯結器的。是否是哪裡配置有問題?

於是內事不決問度娘,外事不決問谷歌。在谷歌無法訪問的條件下,我找了大部分,都是說在 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>

至此,本次配置算是圓滿結束了。原創不易,轉載請註明出處。