web-dev-qa-db-fra.com

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

J'ai récemment mis à jour/mis à jour Entity Framework dans un ancien projet de la version 4 ou 5 à la version 6. Maintenant, j'ai cette exception:

Une exception de type 'System.InvalidOperationException' s'est produite dans EntityFramework.dll mais n'a pas été gérée dans le code utilisateur

Informations complémentaires: Aucun fournisseur Entity Framework n'a été 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.

J'ai googlé l'erreur et suis tombé sur quelques fils SO, mais aucun d'eux ne contenait de solution qui fonctionne pour moi. Voici à quoi ressemble mon App.config:

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

J'ai déjà désinstallé Entity Framework de mon projet et je l'ai réinstallé, supprimé toutes les références aux anciens fichiers EF et réinstallé, mais rien ne fonctionne pour moi. Je continue à avoir cette erreur.

43
Leon Cullens

Ok, c'est assez bizarre. J'ai plusieurs projets: l'un est un projet d'interface utilisateur (un projet ASP.NET MVC) et les autres sont des projets destinés à des éléments tels que des référentiels. Le projet de référentiels faisait référence à EF, mais pas le projet d'interface utilisateur (car il n'en avait pas besoin, il suffisait de faire référence aux autres projets). Après avoir également installé EF pour le projet d'interface utilisateur, tout a commencé à fonctionner. C'est pourquoi, il a ajouté ce morceau de code à mon Web.config:

<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>
34
Leon Cullens

J'ai eu ce problème dans une situation où j'ai un projet de modèle qui contient les références à la fois aux assemblys EntityFramework et .SqlServer, ainsi qu'à un projet d'interface utilisateur distinct qui utilise ASP.NET MVC. Je voulais passer de EF 4.1 à 6.1. En fait, je devais faire une partie de ce qui était décrit ici: http://robsneuron.blogspot.com/2013/11/entity- framework-upgrade-to-6.html . Je tiens à souligner que je n'ai pas ajouté de référence à ces projets à mon projet d'interface utilisateur ni à la configuration du fichier web.config du projet d'interface utilisateur, car ces étapes violeraient ma séparation des préoccupations.

Dans mon projet de modèle, j'ai dû basculer les paramètres de référence "Copier local" pour EntityFramework.SqlServer (et la référence EntityFramework, pour être sûr) sur "False", puis enregistrer tout le texte pour que le projet <Private> noeud dans le fichier .csproj, puis définissez-le à nouveau sur "True" et enregistrez-le à nouveau afin que True devienne la valeur finale.

J'ai également dû ajouter la ligne de hack à ma classe dérivée DbContext dans son constructeur pour forcer l'utilisation de Assembly, même si la ligne ne fait rien. J'ai appris ces deux étapes à partir de l'article de blog.

public MyContext : DbContext
{
    public MyContext() : base("name=MyContext")
    {
        // the terrible hack
        var ensureDLLIsCopied = 
                System.Data.Entity.SqlServer.SqlProviderServices.Instance;   
    }

Je tiens à remercier l'auteur du blog auquel j'ai fait référence, ainsi que toutes les personnes qui ont posé des questions et répondu à SO, afin de nous aider à surmonter ce terrible bug.

47
bcr

J'ai le même problème, la différence est que je n'ai pas accès au code source. J'ai résolu mon problème en mettant la version correcte de EntityFramework.SqlServer.dll dans le répertoire bin de l'application.

15
hendryanw

Je viens de le résoudre. Vous devez réinstaller Entity Framework dans votre solution. Suivez l'une des approches.

First = Cliquez avec le bouton droit de la souris sur la racine de votre solution ou de votre projet, puis cliquez sur Manage NuGet Packages. Sélectionnez "EntityFramework", sélectionnez les projets appropriés et cliquez sur OK.

ou

Second = Accédez au gestionnaire de packages de la console et exécutez Install-Package EntityFramework.

J'espère que ça aide.

12
Sandy

La réponse de Hendry est correcte à 100%. J'ai eu le même problème avec mon application, où il y a un projet de référentiel traitant de la base de données avec l'utilisation de méthodes encapsulant l'opération de contexte EF db. D'autres projets utilisent ce référentiel et je ne veux pas faire référence à EF dans ces projets. D'une manière ou d'une autre, je ne pense pas que cela convienne, j'ai besoin d'EF uniquement dans un projet de référentiel. Quoi qu'il en soit, la copie de EntityFramework.SqlServer.dll dans un autre répertoire de sortie du projet résout le problème. Pour éviter les problèmes, lorsque vous oubliez de copier cette dll, vous pouvez changer le répertoire de construction du référentiel. Accédez aux propriétés du projet de référentiel, sélectionnez l'onglet Construction et, dans la section de sortie, vous pouvez définir le répertoire de sortie sur le répertoire de construction d'un autre projet. Bien sûr, c'est juste une solution de contournement. Peut-être que le hack, mentionné dans un placec, est mieux:

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

Néanmoins, pour le développement, cela suffit. Plus tard, lors de la préparation de l’installation ou de la publication, vous pourrez ajouter ce fichier au package.

Je suis assez nouveau pour EF. Existe-t-il une meilleure méthode pour résoudre ce problème? Je n'aime pas "bidouille" - cela me donne l'impression qu'il y a quelque chose qui n'est "pas sécurisé".

6
Mikk

J'ai résolu le problème en utilisant le code ci-dessous dans mon DBContext

 
 classe partielle publique Q4Sandbox: DbContext 
 {
 public Q4Sandbox () 
: base ("name = Q4Sandbox") 
 {
} 
 
 public virtuel DbSet Employees {get; ensemble; }. } 
} 

Merci à un membre SO.

5
Aji

Ce qui a bien fonctionné pour moi, c’est le déclassement de EF 6.1.3 à EF 6.1.1.

Dans Visual Studios 2012+ dirigez-vous vers:

Outils - Gestionnaire de paquets Nuget - Console du gestionnaire de paquets

Puis entrez:

Install-Package EntityFramework.SqlServerCompact -Version 6.1.1

Je n'ai pas eu à désinstaller EF 6.1.3 _ d'abord parce que la commande ci-dessus le fait déjà.

De plus, je ne sais pas s'il a fait quelque chose, mais j'ai également installé SQL Server CE dans mon projet.

Voici le lien vers la solution que j'ai trouvée:

http://www.itorian.com/2014/11/no-entity-framework-provider-found-for.html

2
Omar

Essayez d'ajouter les liaisons d'assemblage d'exécution suivantes:

<runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
2
SynerCoder

J'ai eu le même problème et la seule chose qui fonctionne pour moi a été de désinstaller le package de structure d'entité de chaque projet à l'aide de Uninstall-Package. Et réintégrez-le dans la solution complète. Il vous demandera de choisir dans quel projet vous souhaitez l'installer, vous devrez tout sélectionner.

2
tavo

Ajoutez "EntityFramework.SqlServer.dll" dans votre dossier bin. Le problème sera résolu.

1
vishal

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

1
BehrouzMoslem

Ce problème peut être dû à une référence de structure d'entité incorrecte ou parfois au nom de classe ne correspondant pas au nom d'entité dans la base de données. Assurez-vous que le nom de la table correspond au nom de la classe.

1
Ranjan

Installez Entity Framework dans chaque projet (ex: dans Web, dans les bibliothèques de classe) à partir de NuGet Package Manager ou bien ouvert Outils - Nuget Package Manager - Console de Package Manager et utilisez Install-Package EntityFramework = installer Entity Framework.

Il n'est pas nécessaire d'ajouter le code ci-dessous dans chaque fichier de configuration. Par défaut, il sera ajouté au projet dans lequel la base de données est appelée via Entity Framework.

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

1
Chandan Y S