web-dev-qa-db-fra.com

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

J'ai eu l'erreur suivante lorsque j'ai utilisé sqlce 4.0 avec entityframework 6.0

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

Mon app.config ressemble à ceci 

....
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
  <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 --></configSections>
 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" >
      <parameters>
        <parameter value =" System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <!--providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers-->
  </entityFramework>
  <connectionStrings>
    <add name="FbMultipleInsOrderContainer" connectionString="metadata=res://*/FbMultipleInsOrder.csdl|res://*/FbMultipleInsOrder.ssdl|res://*/FbMultipleInsOrder.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;data source=|DataDirectory|\FBMultipleOrderSync.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
...

J'ai essayé de réinstaller EF 6. Mais rien n'y fait. 

Toute idée à ce sujet serait très appréciable. 

35
kuhajeyan

Après avoir installé le package EntityFramework.SqlServerCompact nuget, vérifiez que votre app.config contient les éléments suivants (conformément au commentaire de @ ErikEJ ci-dessus):

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>

(Vous pouvez laisser la ligne à SqlClient même si vous n'en avez pas vraiment besoin.)

56
Olly

ErikEJ l'a souligné, mais j'aimerais souligner le fait, vous DEVEZ vous rappeler d'installer le paquet Nuget

EntityFramework.SqlServerCompact

J'ai essayé de suivre la réponse recommandée, mais je ne savais pas que je n'avais pas le paquet NuGet requis que l'App.config faisait référence.

21
David Chiew

J'ai rencontré le problème dans mes tests unitaires. Le problème, c’est que l’erreur est apparue pas constamment ... J'ai réussi à la résoudre en ajoutant la classe suivante ma solution de tests unitaires:

public static class Trick
{
    public static void FixEfProviderServicesProblem()
    {
        // this commented line should be used for SQL Server provider
        //var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

        // this is used for SQL Server CE provider
        var instance = System.Data.Entity.SqlServerCompact.SqlCeProviderServices.Instance;
    }
}
6
Yaugen Vlasau

Pour cela, il vous suffit d’enregistrer le EntityFramework.SqlServerCompact dans la console du gestionnaire de paquet,

Pour ce faire, ouvrez la console du gestionnaire d’alimentation et tapez la commande ci-dessous:

PM> Install-Package EntityFramework.SqlServerCompact
5
AKS

Mon problème était les tests unitaires. Vous avez probablement uniquement installé le framework Entity pour votre projet, mais pas vos tests unitaires. Faire cela:

Faites un clic droit "Solution" dans l'Explorateur de solutions (pas le nom de votre projet)

Cliquez sur "Gérer les paquets NuGet"

Recherchez EntityFramework et appuyez dessus

Vous ne verrez probablement pas de coche à côté de [Nom du projet] .Tests

1
KSHMR

la solution fournie est correcte mais elle n'explique pas pourquoi EF a besoin de cette assemblée. Voici pourquoi ...

Par défaut, la configuration d'EF vous permet de créer une section "defaultConnectionFactory" dans entityFramework. Cette fabrique par défaut est configurée sur "LocalDbConnectionFactory" et son paramètre est "mssqllocaldb".

Cette usine nécessite en interne "SqlServerCe.4.0", c'est-à-dire "SqlServerCompact". 

L'erreur se produit uniquement si l'EF utilise sa chaîne de connexion par défaut dans DbContext. Si EF est fourni avec une autre chaîne de connexion spécifiée dans votre configuration, cette erreur n'apparaît pas. Parce que EF utilise par défaut la fabrique de connexions par défaut. 

une fois que vous avez installé "SqlServerCe 4.0", la configuration de EF est modifiée et "LocalDbConnectionFactory" et son paramètre est "mssqllocaldb" sont remplacés par "SqlServer Ce 4.0". et runtime EF est également capable de trouver l’assemblage SqlServerCe4.0 (car il fait maintenant partie de vos références et est placé physiquement dans votre BIN).

Voici la configuration EF avant et après l’installation de Sql Server Compact.

ANCIENNE CONFIG:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="mssqllocaldb" />
          </parameters>
        </defaultConnectionFactory>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>

La nouvelle configuration est comme ci-dessous:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
    </providers>
  </entityFramework>

et aussi il a ajouté la section suivante pour décrire la nouvelle usine

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

Pour résoudre ce problème

Menu Visual Studio -> Outils -> Gestionnaire de paquets NuGet -> Gérer les paquets NuGet pour la solution

Sélectionnez l'onglet "Parcourir" et recherchez les éléments suivants "EntityFramework.SqlServerCompact". 

Installez-le. 

Ça devrait marcher.

1
Neville Dabreo

Cette erreur s'est produite sur un PC utilisateur. L’utilisateur a ignoré une erreur précédente "La section‘ DbProviderFactories ’ne peut apparaître qu’une fois par fichier de configuration".

Apparemment, DB2 a corrompu le fichier de configuration de la machine sur son PC en ajoutant une balise <DbProviderFactories /> dupliquée (et vide).

La solution consistait à supprimer la balise dupliquée vide. Le fichier de configuration de la machine est situé dans [WindowsDir]\Microsoft.Net\Framework [Version .NET]\Config\Machine.config.

1
ActualRandy

N'oubliez pas que Package Manager Console prend app.config/web.config comme projet de démarrage sélectionné!

0
mr_squall

Dans Visual Studio, tous les fichiers .dll existant dans le dossier _bin_deployableAssemblies doivent être définis sur Build Action: none

Tous les fichiers .dll pour moi étaient réglés sur content

C’est ce que j’ai défini, et cela a fonctionné immédiatement après:

 enter image description here

0
Dave

Pour moi, parce que le programmeur n’est pas le seul, certains installent déjà EntityFramework.SqlServerCompact, mais lorsque je récupère mon ordinateur et que RUN affiche le message d’erreur ci-dessus, je désinstalle puis installe à nouveau.

0
Haryono