無法載入實體框架提供程序類型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer”
我使用 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 不會檢測到需要該程序集,並且不會將其複製到輸出目錄