web-dev-qa-db-de.com

Für den ADO.NET-Anbieter mit dem unveränderlichen Namen 'System.Data.SqlServerCe.4.0' wurde kein Entity Framework-Anbieter gefunden

Ich habe die folgende Fehlermeldung erhalten, als ich sqlce 4.0 mit entityframework 6.0 verwendete

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

Meine app.config sieht so aus 

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

Ich habe versucht, EF 6 erneut zu installieren. Aber es hat keinen Erfolg. 

Jeder Hinweis darauf wäre sehr spürbar. 

35
kuhajeyan

Überprüfen Sie nach der Installation des Pakets EntityFramework.SqlServerCompact nuget, ob Ihre app.config Folgendes enthält (wie in dem Kommentar von @ ErikEJ oben):

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

(Sie können die Zeile für SqlClient belassen, auch wenn Sie sie nicht wirklich benötigen.)

56
Olly

ErikEJ hat darauf hingewiesen, aber ich möchte die Tatsache hervorheben, dass Sie daran denken müssen, das Nuget-Paket zu installieren

EntityFramework.SqlServerCompact

Ich versuchte, der empfohlenen Antwort zu folgen, wusste jedoch nicht, dass ich nicht über das erforderliche NuGet-Paket verfügte, auf das App.config verweist.

21
David Chiew

Ich habe das Problem in meinen Unit-Tests getroffen. Das Tückische daran war, dass der Fehler nicht ständig aufgetaucht war ... Ich konnte es lösen, indem er die folgende Klasse hinzufügte.

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

Um dies zu erreichen, müssen Sie lediglich den EntityFramework.SqlServerCompact in der Package Manager Console registrieren.

Öffnen Sie dazu die Power Manager-Konsole und geben Sie den folgenden Befehl ein:

PM> Install-Package EntityFramework.SqlServerCompact
5
AKS

Mein Problem waren die Unit-Tests. Sie haben wahrscheinlich nur das Entity-Framework für Ihr Projekt installiert, nicht jedoch Ihre Komponententests. Um dies zu tun:

Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf "Lösung" (nicht der Name Ihres Projekts).

Klicken Sie auf "NuGet-Pakete verwalten".

Suchen Sie nach EntityFramework und drücken Sie es

Neben [Projektname] .Tests wird wahrscheinlich kein Haken angezeigt

1
KSHMR

die angebotene Lösung ist korrekt, erklärt aber nicht, warum EF diese Assembly benötigt. Hier ist warum ...

In der Standardkonfiguration von EF können Sie über einen Abschnitt "defaultConnectionFactory" im gesamten EntityFramework verfügen. Diese Standard-Factory ist auf "LocalDbConnectionFactory" konfiguriert und ihr Parameter ist "mssqllocaldb".

Diese Factory erfordert intern "SqlServerCe.4.0", d. H. "SqlServerCompact". 

Der Fehler tritt nur auf, wenn die EF ihre Standardverbindungszeichenfolge in DbContext verwendet. Wenn EF mit einer anderen angegebenen Verbindungszeichenfolge in Ihrer Konfiguration bereitgestellt wird, wird dieser Fehler nicht angezeigt. Weil EF standardmäßig die Standardverbindungsfactory verwendet. 

wenn Sie "SqlServerCe 4.0" installieren, wird die Konfiguration von EF geändert und "LocalDbConnectionFactory" und der Parameter "mssqllocaldb" werden durch "SqlServer Ce 4.0" ersetzt. Die EF-Laufzeitumgebung kann auch die SqlServerCe4.0-Assembly finden (da sie nun Teil Ihrer Referenzen ist und sich physisch in Ihrer BIN befindet).

Es folgt die EF Config vor und nach der Installation von SQL Server Compact

ALTE Konfig:

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

Die neue Konfiguration ist wie folgt:

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

außerdem wurde der folgende Abschnitt hinzugefügt, um die neue Fabrik zu beschreiben

<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

So lösen Sie dieses Problem

Visual Studio-Menü -> Extras -> NuGet Package Manager -> NuGet-Pakete für Lösung verwalten

Wählen Sie die Registerkarte "Durchsuchen" und suchen Sie nach "EntityFramework.SqlServerCompact". 

Es installieren. 

Es sollte funktionieren.

1
Neville Dabreo

Dieser Fehler ist auf einem Benutzer-PC aufgetreten. Der Benutzer hat einen vorherigen Fehler ignoriert "Der Abschnitt" DbProviderFactories "kann nur einmal pro Konfigurationsdatei angezeigt werden".

Offenbar hat DB2 die Maschinenkonfigurationsdatei auf ihrem PC durch Hinzufügen eines doppelten (und leeren) <DbProviderFactories />-Tags beschädigt.

Die Lösung bestand darin, das leere Duplikat-Tag zu löschen. Die Maschinenkonfigurationsdatei befindet sich unter [WindowsDir]\Microsoft.Net\Framework [.NET-Version]\Config\Machine.config

1
ActualRandy

Vergessen Sie nicht, dass die Package Manager Console app.config/web.config als Startup-Projekt ausgewählt hat!

0
mr_squall

In Visual Studio müssen alle .dll-Dateien, die sich im _bin_deployableAssemblies-Ordner befinden, auf Build Action: none gesetzt werden.

Alle DLL-Dateien wurden für mich auf content gesetzt. 

Darauf habe ich es eingestellt, und es hat direkt danach funktioniert:

 enter image description here

0
Dave

Da es sich bei dem Programmierer nicht nur um einen Programmierer handelt, ist bereits ein Programmierer installiert, der EntityFramework.SqlServerCompact installiert hat, aber wenn ich meinen PC und die oben gezeigte Fehlermeldung "Run" anschaue, deinstalliere und installiere ich ihn erneut.

0
Haryono