I created a WCF Service using dotNet 4.5. The database layer is built with Entity Framework 6.
I hosted the service with IIS 8. It is working fine.
Now I need to consume the service with windows forms client, that is built using dotnet framework 3.5.
I can create the service reference successfully. But when I run the code, getting the following error;
The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
I fixed this by installing entity framework in the WCF host site.
You don't need to Install EF6 NuGet Package in client application, The error is not related to client application because the client application connects to WCF Services and don't know even if a database or data access layer exists.
This error is related to lack of
EntityFramework.SqlServer.dll in bin folder of your service library and/or host project.
The most simple way is to install EF6 using NuGet Package Manager in your WCF Host project too, and if it has been installed before, try uninstalling and installing it again. This way
EntityFramework.SqlServer.dll to output directories.
Please note that this way is somehow against n-layered rules because this your libraries above data access layer are dependent to EF6 which is not so good.
As a workaround to copy
EntityFramework.SqlServer.dll in output directories, make sure
Copy Local of this dll is set to
true and then put this code in your
var ensureDllIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
EntityFramework.SqlServer.dll is copied to output directory of consumers of data access project. This is a workaround.
Using this way you don't have any dependency to EF in your layers above data access layer.