Dot-Net

無法載入實體框架提供程序類型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer”

  • August 14, 2020

我使用 dotNet 4.5 創建了一個 WCF 服務。數據庫層是使用 Entity Framework 6 建構的。

我使用 IIS 8 託管該服務。它執行良好。

現在我需要使用使用 dotnet 框架 3.5 建構的 windows 窗體客戶端來使用該服務。

我可以成功創建服務引用。但是當我執行程式碼時,出現以下錯誤;

無法載入在應用程序配置文件中為具有不變名稱“System.Data.SqlClient”的 ADO.NET 提供程序註冊的實體框架提供程序類型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer”。確保使用程序集限定名稱並且程序集可用於正在執行的應用程序。有關詳細資訊,請參閱http://go.microsoft.com/fwlink/?LinkId=260882

有什麼建議麼?

您不需要在客戶端應用程序中安裝EF6 NuGet 包,該錯誤與客戶端應用程序無關,因為客戶端應用程序連接到 WCF 服務並且不知道是否存在數據庫或數據訪問層。

EntityFramework.SqlServer.dll此錯誤與您的服務庫和/或宿主項目的 bin 文件夾中缺少有關。

選項1

最簡單的方法是在您的 WCF 主機項目中也使用 NuGet 包管理器安裝 EF6,如果之前已安裝,請嘗試解除安裝並重新安裝。這種方式EntityFramework.SqlServer.dll輸出目錄。

請注意,這種方式在某種程度上違反了 n 層規則,因為您的數據訪問層之上的庫依賴於不太好的 EF6。

選項 2

作為在輸出目錄中複製的一種解決方法,請EntityFramework.SqlServer.dll確保Copy Local將此 dll 設置為true,然後將此程式碼放入您的DbContext建構子中:

var ensureDllIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance; 

它確保EntityFramework.SqlServer.dll被複製到數據訪問項目消費者的輸出目錄。這是一種解決方法。

使用這種方式,您在數據訪問層之上的層中對 EF 沒有任何依賴。

許多人報告在使用 EF 6 和 Code First 時圍繞 EntityFramework.SqlServer 提供程序(或他們正在使用的另一個提供程序)未在本地複制的問題。這會導致以下錯誤:

System.InvalidOperationException:無法載入在應用程序配置文件中為具有不變名稱“System.Data.SqlClient”的 ADO.NET 提供程序註冊的實體框架提供程序類型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer” . 確保使用程序集限定名稱並且程序集可用於正在執行的應用程序。有關詳細資訊,請參閱http://go.microsoft.com/fwlink/?LinkId=260882

僅在啟動項目中未安裝 EntityFramework NuGet 包(即僅安裝在類庫等中)時才會出現這種情況。

此問題並非特定於實體框架,而是 MSBuild 如何確定需要部署哪些程序集的副作用。出現此問題的原因是應用程序中沒有明確引用 EntityFramework.SqlServer.dll(或相關提供程序程序集)中的類型的程式碼,因為 EF 將在執行時根據 App/Web.config 文件中的資訊載入程序集。因此,MSBuild 不會檢測到需要該程序集,並且不會將其複製到輸出目錄

引用自:https://stackoverflow.com/questions/32607736