web-dev-qa-db-fra.com

Aucun fournisseur Entity Framework trouvé pour le fournisseur ADO.NET avec le nom invariant 'System.Data.SqlClient'.

Nous utilisons EntityFramework 6 avec Code First. Nous avons une application de console qui ne fait pas référence à EntityFramework mais lit la chaîne de connexion à partir de son App.config. Il appelle l'assembly DatabaseInitializationUtilities en transmettant la chaîne de connexion en tant que paramètre. 

DatabaseInitializationUtilities a la référence EF6 (EntityFramework et EntityFramework.SqlServer). Son App.config est la suivante:

<?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>

Lorsque l'exécution atteint une ligne où DatabaseInitializationUtilities tente d'exécuter un script

context.Database.ExecuteSqlCommand(script.ScriptText)

l'erreur est levée:

Aucun fournisseur Entity Framework trouvé pour le fournisseur ADO.NET avec le nom invariant 'System.Data.SqlClient'. Assurez-vous que le fournisseur est enregistré dans la section 'entityFramework' du fichier de configuration de l'application. Voir http://go.Microsoft.com/fwlink/?LinkId=260882 pour plus d'informations.

Je crois que le remède est exactement ce que j'ai dans mon fichier de configuration, donc je ne comprends pas le problème.

REMARQUE: Resharper bluelining le nœud et le reporting "L'élément 'EntityFramework' a un élément enfant non valide 'fournisseurs'. Cependant, cette section a été injectée par NuGet lors de l'installation de EF6.

Des idées?

34
Dewey

Vous devez créer une référence afin qu'elle soit copiée dans le dossier de débogage. Donc, plus tard, il peut accéder au runtime. 

Ne copiez aucun fichier, créez simplement cette référence:

private volatile Type _dependency;

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

avez-vous l'assembly EntityFramework.SqlServer.dll dans le chemin de votre application?.

17
Thomas
13
Motty

J'ai eu ce problème également. Tout fonctionnait localement lorsque j'ai exécuté mon application .net mvc, mais lorsque je l'ai publiée, j'ai eu cette erreur. Le problème était que je devais faire référence à EntityFrameworl.SqlServer également dans mon projet Web bien que j'avais un projet séparé pour Data. Ce qui est étrange, c'est que cette erreur n'a été levée que lorsque l'application a été publiée. Ceci est probablement un sérieux bug de Microsoft. J'ai utilisé EF 6.1.1.

5
TheMentor

En effet, EntityFramework.SqlServer.dll n'est pas copié dans votre projet. Ajoutez cette dll et cela fonctionnera, espérons-le. Vous pouvez le trouver dans le projet où vous avez ajouté datamodel.

4
Baqer Naqvi

Pour moi, il est apparu que ma référence de fournisseur dans le fichier web.config était incorrecte. Je crois que le paquet de nuget pourrait ne pas inclure correctement le fournisseur.

J'ai remplacé mon fournisseur par ceci et cela a fonctionné:

  <entityFramework>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
      <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      </providers>
  </entityFramework>
2
David Price

J'ai aussi eu un problème similaire

Mon problème a été résolu en procédant comme suit:  enter image description here

 enter image description here

0
BehrouzMoslem

Ajouter "EntityFramework.SqlServer.dll" dans le dossier bin de votre projet aura résolu votre problème.

0
vishal

J'ai tendance à ajouter EntityFramework au projet Web ainsi qu'à l'assembly qui le référence.

0
David Hyde

Le meilleur moyen de résoudre ce type de problème est d’inclure la référence EntityFramework.SqlServer.dll dans votre projet. Appuyez sur la touche F4 (sur les propriétés) pour définir la propriété Copier en local = True afin que chaque app il sera copié dans le dossier publié.

0
Muhammad Saqib