No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'.




(8)

We are using EntityFramework 6 with Code First. We have a console app that has no reference to EntityFramework but reads the connection string from its App.config. It calls the DatabaseInitializationUtilities assembly passing the connection string as a parameter.

DatabaseInitializationUtilities has the reference to EF6 (EntityFramework and EntityFramework.SqlServer). Its App.config is this:

<?xml version="1.0" encoding="utf-8"?>
  <configuration>
     <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
      <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
     </configSections>
     <system.serviceModel>
         <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IAuthentication" />
            </basicHttpBinding>
         </bindings>
         <client>
            <endpoint address="http://localhost/SecurityServices/Authentication.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAuthentication" contract="SecurityService.IAuthentication" name="BasicHttpBinding_IAuthentication" />
         </client>
      </system.serviceModel>
      <entityFramework>
         <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
            <parameters>
               <parameter value="v11.0" />
            </parameters>
         </defaultConnectionFactory>
         <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
         </providers>
      </entityFramework>
   </configuration>

When execution reaches a line where DatabaseInitializationUtilities attempts to run a script

context.Database.ExecuteSqlCommand(script.ScriptText)

the error is thrown:

No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

I believe the remedy is exactly what I have in my config file, so I don't understand the problem.

NOTE: Resharper is bluelining the node and reporting "The element 'EntityFramework' has an invalid child element 'providers'. However, the section was injected by NuGet when I installed EF6.

Any ideas?


Check your config file and add an Entry for the DbProviderFactories like this:

<system.data>
  <DbProviderFactories>
     <remove invariant="System.Data.SqlServerCe.4.0" />
    <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
 </DbProviderFactories>
</system.data>


I think problem is both SQL Server CE components installed in your system.

My solution :

<DbProviderFactories>
    <remove invariant="System.Data.SqlServerCe.3.5" />
    <remove invariant="System.Data.SqlServerCe.4.0" />

    <add name="Microsoft SQL Server Compact Data Provider 4.0" 
         invariant="System.Data.SqlServerCe.4.0" 
         description=".NET Framework Data Provider for Microsoft SQL Server Compact" 
         type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>

Nuget will configure your EF6 project to reference EntityFramework.SqlServer.dll. This deploys to the output folder for your EF6 project during build, but it will not deploy to the output folder for projects referencing your EF6 project. I believe this is because Visual Studio is "smart" enough to detect that nothing in your assembly is actually using the dll directly and so does not include it. You can force EntityFramework.SqlServer.dll to be deployed to the output folder of projects referencing your EF6 project (unit tests, UI's etc.) by adding code to your EF6 project that uses EntityFramework.SqlServer.dll. Be careful not to put the code in a generated class as you risk losing it on next regen. I chose to add the following class to the assembly, which fixed the problem.

using System.Data.Entity.SqlServer;

internal static class MissingDllHack
{
    // Must reference a type in EntityFramework.SqlServer.dll so that this dll will be
    // included in the output folder of referencing projects without requiring a direct 
    // dependency on Entity Framework. See http://.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

You need to create a reference, so it will be copied in the debug folder. So later it can accessed in runtime.

Don't to copy any files, just create this reference:

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}

You've added EF to a class library project, you also need to add it to the project that references it (your console app, website or whatever).


C# program is looking for sql server compact 3.5, but I'm using 4.0

I had the same issue and solved it based on this link.

Find this section in your App.config:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

And change oldVersion="0.0.0.0-4.0.0.1" to oldVersion="4.0.0.0-4.0.0.1"


Entity Framework Provider type could not be loaded?

Same problem, but i installed EF 6 through Nuget. EntityFramework.SqlServer was missing for another executable. I simply added the nuget package to that project.