Für den ADO.NET-Anbieter mit dem invarianten Namen 'System.Data.SqlClient' wurde kein Entity Framework-Anbieter gefunden.

543

Nach dem Herunterladen des EF6 per Nuget und dem Versuch, mein Projekt auszuführen, wird der folgende Fehler zurückgegeben:

Für den ADO.NET-Anbieter mit dem invarianten Namen 'System.Data.SqlClient' wurde kein Entity Framework-Anbieter gefunden. Stellen Sie sicher, dass der Anbieter im Abschnitt 'entityFramework' der Anwendungskonfigurationsdatei registriert ist. Weitere Informationen finden Sie unter http://go.microsoft.com/fwlink/?LinkId=260882 .

Geben Sie hier die Bildbeschreibung ein

Fernando Vellozo
quelle
Ich benutze EF5 ohne das providersund providerso, also überlegen Sie es zu entfernen?
ta.speot.is
1
Legen
Die Verbindungszeichenfolge befindet sich im Bild (App.confing), ist übrigens sehr einfach, ich nenne den Konstruktor public BaseStorage(): base ("RaptorDB") {}, BaseStorage () erbt von DbContext in EF5 alles hat perfekt funktioniert, nicht bereits in EF6.
Fernando Vellozo
10
Das Problem wird durch die Installation von EF6, dem zweiten Projekt (Konsole), gelöst, danke an alle, die in irgendeiner Weise geholfen haben!
Fernando Vellozo
3
Für mich schien dies darauf zurückzuführen zu sein, dass Visual Studio nicht realisierte, dass die EntityFramework.SqlServer-Assembly tatsächlich vom Basisprojekt verwendet wurde. Wenn Sie so etwas wie die Antwort von @ Carra tun, müssen Sie nicht jedem Projekt, das auf Ihr Basisprojekt verweist, EF hinzufügen - viel sauberer.
Dorf

Antworten:

608

Ich bin gerade auf das gleiche Problem gestoßen und es sieht so aus, als ob EntityFramework, obwohl es über NuGet Package Manager installiert wurde, nicht korrekt im Projekt installiert wurde.

Ich konnte das Problem beheben, indem ich den folgenden Befehl in der Package Manager-Konsole ausführte :

PM> Install-Package EntityFramework
Douglaslps
quelle
34
PMC schrieb, dass 'EntityFramework 6.0.1' bereits installiert war, fügte es jedoch meiner Konsolen-App hinzu (die eigentlich NICHT EF verwendet), aber es hat auch den Trick für mich getan. II EF aus Konsolen-App-Referenzen entfernen, Fehler zurückgeben, ich verstehe das nicht - meine Konsolen-App verwendet ein Repository-Projekt (das EF verwendet) Vielen Dank für Ihre Hilfe!
Prokurors
33
Vergessen Sie nicht, -ProjectName <ProjectName> zur Befehlszeile hinzuzufügen, wenn Ihre Lösung mehrere Projekte enthält ... !!!
Eugenio Miró
1
Verwenden Sie die -PreOption, um nuget anzuweisen, Vorabversionspakete zu installieren. Ich empfehle es nicht. Ich habe einen ähnlichen Fehler, aber die Lösung bestand darin, EntityFramework einfach im Host-Projekt zu installieren. Ich habe es in einer Klassenbibliothek installiert, aber nicht im Hauptprojekt (Web / Konsole / oder was auch immer)
Davide Icardi
10
Selbes Problem hier. Ich hatte ein Projekt, das keinen Verweis auf EF hatte, aber die EF-DLL befand sich im Debug-Ordner. Ausführen dieses Befehls für dieses Projekt EntityFramework.SqlServer.dll, das dem Debug-Ordner hinzugefügt wurde - Problem behoben.
Qujck
4
In meiner Situation trat dieser Fehler erst auf, als ich das Projekt auf unserem Testserver bereitstellte. In der Tat fehlte EntityFramework.SqlServer.dll, und die Installation von EF über den Paketmanager funktionierte. Es wurden nur die beiden relevanten Verweise zum Projekt hinzugefügt und anschließend die entityFramework-Einstellungen zur web.config hinzugefügt. Ich denke, der lokale IIS konnte die Assembly lokal beziehen, aber der vollständige IIS auf dem Webserver konnte aufgrund von Berechtigungen nicht?
Atters
384

Sie haben einem Klassenbibliotheksprojekt EF hinzugefügt. Sie müssen es auch dem Projekt hinzufügen, das darauf verweist (Ihre Konsolen-App, Website oder was auch immer).

Clément Picou
quelle
247
Dies ist eine absolut lächerliche Antwort. Warum um alles in der Welt sollte ich das tun müssen? Und wissen Sie, was noch lächerlicher ist? Es klappt.
Robert
19
Siehe meine Antwort unten, Sie müssen EF nicht in Ihrer Konsolenanwendung installieren.
Francisco Goldenstein
7
Ihre Antwort ist richtig. Fügen Sie dem Frontend-Projekt, das eine Bibliothek mit EF verwendet, nur die Referenz EntityFramework.SqlServer.dll hinzu. Beheben Sie das Problem. Verwenden Sie also nicht diese EF (nur die DLL)
Harvey
31
Sie müssen nicht müssen einen Verweis auf EF in der Konsole / Web - App hinzufügen. Sie müssen nur sicherstellen, EntityFramework.SqlServer.dlldass in das bin-Verzeichnis kopiert wird. Das Hinzufügen einer starken Referenz kann Ihre Architektur beschädigen (wenn Sie mehrere Ebenen erstellt haben, sollte Ihre ausführende Assembly auf oberster Ebene nicht einmal über EF Bescheid wissen). Stattdessen können Sie sicherstellen, dass der SQL Server-Anbieter kopiert wird. Siehe zum Beispiel stackoverflow.com/a/19130718/870604
ken2k
3
Ich vermute, dass die EntityFramework.SqlServer.dll nicht als Abhängigkeit erkannt wird, weil das Entity Framework sie dynamisch lädt. Woher soll Ihr Projekt wissen, dass es über den SQL-Anbieter kopiert, wenn der einzige Verweis darauf in der Konfigurationsdatei enthalten ist?
Joel McBeth
209

Sie müssen Entity Framework nicht in Ihrer Konsolenanwendung installieren, sondern nur einen Verweis auf die Assembly EntityFramework.SqlServer.dll hinzufügen. Sie können diese Assembly aus dem Klassenbibliotheksprojekt, das Entity Framework verwendet, in einen LIB-Ordner kopieren und einen Verweis darauf hinzufügen.

Zusammenfassend:

  • Klassenbibliotheksanwendung:
    • Installieren Sie Entity Framework
    • Schreiben Sie Ihren Datenschichtcode
    • Die Datei app.config enthält alle Konfigurationen für Entity Framework mit Ausnahme der Verbindungszeichenfolge.
  • Erstellen Sie eine Konsolen-, Web- oder Desktopanwendung:
    • Fügen Sie einen Verweis auf das erste Projekt hinzu.
    • Fügen Sie einen Verweis auf EntityFramework.SqlServer.dll hinzu.
    • app.config / web.config hat die Verbindungszeichenfolge (denken Sie daran, dass der Name des Konfigurationseintrags mit dem Namen der DbContext-Klasse übereinstimmen muss.

Ich hoffe, es hilft.

Francisco Goldenstein
quelle
18
Richtige Antwort. Keine Notwendigkeit, EF zu installieren. EntityFramework.SqlServer.dll.
Tom Stickel
15
Ich muss zustimmen. Dies ist völlig die richtige Antwort. Verweisen Sie auf eine DLL mit einer Größe von 1/2 MB oder ziehen Sie das EF-Nuget-Projekt mit einer Größe von> 5,5 MB. Reduziert ein wenig den Wert der Architektur mehrerer Ebenen. Schlechte Show von MS wirklich: Ich habe 4 Stufen und meine oberste Stufe sollte wirklich keinen Grund haben, etwas über EF zu wissen
72GM
18
Trotzdem lächerlich. zB Warum benötigt ein Frontend einen Verweis auf SqlServer? Das Frontend könnte in meinem Fall nicht weniger interessieren. Aber es funktioniert. +1
Mike de Klerk
2
Das war hilfreich. Vielen Dank.
Peter_the_oak
1
Wird es nicht schwierig sein, Versionen von EntityFramework zu aktualisieren? Sie müssen daran denken, den Verweis auf die DLL zu aktualisieren
Crush
114

Sie können diese Meldung auch sehen, wenn Sie vergessen haben, "EntityFramework.SqlServer.dll" einzuschließen.

Es scheint sich um eine neu hinzugefügte Datei in EF6 zu handeln. Anfangs hatte ich es nicht in mein Zusammenführungsmodul aufgenommen und bin auf das hier aufgeführte Problem gestoßen.

Mike
quelle
7
Ich bin auf dieses Problem gestoßen, als ich zuvor ein Projekt (a) mit einem Verweis auf ein Projekt (b) hatte, das einen Verweis auf EF hatte. Nach dem Bereinigen und Löschen des Projektordners (a) und dem erneuten Erstellen wurde die EF-Referenz gefunden, jedoch nicht EF.SqlServer.dll. Das manuelle Kopieren hat bei mir funktioniert
dan richardson
2
@dan richardson danke für die Erwähnung 'Bin Ordner löschen'.
Rajshekar Reddy
Ich habe den Fehler erhalten, als ich versucht habe, ein LINQPad-Skript nach einem EF6-Upgrade auszuführen. Selbst das Verweisen auf EntityFramework.SqlServer.dll in LINQPad hat es nicht behoben, BIS ich meine Lösung in VS2013 neu erstellt habe. Die neue Referenz wurde dann in LINQPad ordnungsgemäß aufgelöst und mein Skript wurde ausgeführt!
Chris
In meinem Fall war ich in der Entwicklungsumgebung in Ordnung, aber als ich veröffentlichte, erscheint das Problem, auf das verwiesen wird. Nachdem ich die Liste der Bibliotheken in dev mit dem bin-Ordner auf dem Server verglichen hatte, bemerkte ich, dass EntityFramework.SqlServer.dll nicht vorhanden war. Ich habe es nur hochgeladen und die App aktualisiert und es behoben.
Henry Rodriguez
Das war das Problem für mich, danke! Sehen Sie sich die saubere Lösung von @Anders an, um Probleme zu vermeiden, die vergessen, die DLL in jedes erforderliche Projekt aufzunehmen.
SharpC
54

Anstatt EntityFramework.SqlServer zum Hostprojekt hinzuzufügen, können Sie einen statischen Verweis darauf aus Ihrem Modell- / Entitätsprojekt wie folgt sicherstellen

static MyContext()
{
    var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    if(type == null)
        throw new Exception("Do not remove, ensures static reference to System.Data.Entity.SqlServer");
}

Dadurch wird der Erstellungsprozess die Assembly mit dem Hostprojekt einschließen.

Weitere Informationen in meinem Blog http://andersmalmgren.com/2014/08/20/implicit-dependencies-and-copy-local-fails-to-copy/

Anders
quelle
5
Ich denke, dies ist eine schöne, saubere Lösung, bei der wir keine Verweise auf persistenzbezogene DLLs in Projekte aufnehmen müssen, die persistenzunabhängig sein sollten.
JTech
3
Einverstanden, und es gilt für jede Bibliothek mit impliziten Abhängigkeiten, nicht nur Persistenz
Anders
3
Wenn Sie eine explizite Abhängigkeit von einem Typ in einer Assembly haben, wird dieser vom Erstellungsprozess kopiert. Hier besteht jedoch keine explizite Abhängigkeit, und der Erstellungsprozess kann die Assembly nicht in den Erstellungsordner kopieren. Mein Code stellt nur sicher, dass in dieser Assembly ein expliziter Verweis auf einen beliebigen Typ vorhanden ist.
Anders
2
Ohne sie gibt es keine explizite Abhängigkeit von Ihrem Code von der Baugruppe und sie wird nicht in die Ausgabe kopiert
Anders
2
Das ist brilliant.
Kris
48

Wenn Sie Entity Framework 6 über installieren Nuget. EntityFramework.SqlServer fehlt manchmal für eine andere ausführbare Datei. Fügen Sie einfach das NugetPaket zu diesem Projekt hinzu.

Manchmal funktioniert das oben genannte für Testprojekt nicht

Um dieses Problem in Test Project zu lösen, platzieren Sie diese Methode einfach in Test Project:

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

Diese Methode wurde nie aufgerufen, aber meiner Beobachtung nach entfernt der Compiler alle "unnötigen" Assemblys, und ohne das EntityFramework.SqlServerMaterial zu verwenden, schlägt der Test fehl.

Umar Abbas
quelle
2
Nun, das ist nicht schön, aber es hat das Problem behoben, das ich in meinem Testprojekt hatte. Keine der anderen Lösungen funktionierte.
Honourable Chow
In meinem Fall war es ausreichend, das Entity Framework auch zu meinem Testprojekt in "Verwalten von Nuget-Paketen für die Lösung" hinzuzufügen
Juha Palomäki
Tatsächlich müssen Sie in jedes Projekt (nicht nur einen Test) einfügen, um sicherzustellen, dass System.Data.Entity.SqlServer nach der Kompilierung in "results lib set" aufgenommen wird (Hinweis: Unity oder ein anderes IoC-Tool könnte diese Regel ändern, und Sie werden es tun müssen diesen Code aus dem Testprojekt aufrufen).
Roman Pokrovskij
Dies ist tatsächlich die beste Lösung, da Sie nicht überall in Ihrem Projekt Entity-Framework-Referenzen sprühen müssen.
Daniel Lobo
Dies zeigte mir die richtige Richtung. Das EntityFramework.SqlServerwird Ihrer Klassenbibliothek hinzugefügt, aber wenn es nicht verwendet wird, wird es nicht im Ausgabeordner Ihrer Anwendung abgelegt. Ich habe das Problem behoben, indem ich eine hinzugefügt habe ExecutionStrategy, was ich noch tun musste. Durch Hinzufügen einer Zeile wie SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());in einer DbConfigurationKlasse wurde das Problem behoben.
Jan_V
24

Fügen Sie diese Funktion hinzu

private void FixEfProviderServicesProblem()

Die Datenbankkontextklasse in der Bibliotheksklasse und die fehlende DLL EntityFramework.SqlServer.dll werden an die richtigen Stellen kopiert.

namespace a.b.c
{
    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    {
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        {
        }

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions { get; set; }
        public virtual DbSet<WorkflowInstance> WorkflowInstances { get; set; }
        public virtual DbSet<EngineAlert> EngineAlerts { get; set; }
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems { get; set; }
        public virtual DbSet<TaskItem> TaskItems { get; set; }
        public virtual DbSet<TaskItemLink> TaskItemLinks { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }

        private void FixEfProviderServicesProblem()
        {
            // The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
            // for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
            // Make sure the provider assembly is available to the running application. 
            // See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
            var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        }
    }
}

.

Johannes
quelle
Es tut mir leid, dass ich versucht habe, es zu widerrufen ... da ich nicht dachte, dass es funktionieren würde ... und es tut! ... es heißt, ich kann meine Stimme nicht ändern, es sei denn, die Antwort wurde bearbeitet, weil es zu lange her ist und seitdem war gesperrt ...
Seabizkit
Das hat auch bei mir funktioniert. Wir haben ein Bibliotheksprojekt, das EF 6 verwendet, und eine Konsolenanwendung, die die Bibliothek verwendet. Wir bekamen die gleiche Ausnahme wie das OP. Wir möchten keine EntityFramework-spezifische Konfiguration in die Anwendungskonfigurationsdatei einfügen, daher hat diese Methode für uns funktioniert. Vielen Dank
Rob
1
Wo rufst du an? FixEfProviderServicesProblemIch habe es im Konstruktor versucht, ohne Glück.
Francis Ducharme
1
Ich nenne es nie - muss nicht. Die Tatsache, dass es dort ist, lässt .net denken, dass es notwendig ist, und schließt das EntityFramwork als Abhängigkeit ein.
Johannes
Wahrscheinlich von stackoverflow.com/a/19130718/1467396 ? Aber +1, trotzdem für die Klarheit, wie / wo es verwendet werden soll.
David
20

Nichts davon hat bei mir funktioniert. Ich habe die Lösung in einer anderen Frage zum Stapelüberlauf gefunden . Ich werde es hier als einfache Referenz hinzufügen:

Sie müssen eine Referenz erstellen, damit diese in den Anwendungspfad kopiert wird. Denn später wird zur Laufzeit darauf verwiesen. Sie müssen also keine Dateien kopieren.

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
Carra
quelle
2
Diese! Es ist nicht erforderlich, einen Verweis auf andere Projekte hinzuzufügen, die möglicherweise auf diese Assembly verweisen.
Dorf
8

Ich habe den gleichen Fehler bei der Verwendung von Entity Framework 6 mit SQL Server Compact 4.0 erhalten. Der Artikel über MSDN für Entity Framework-Anbieter für EF6 war hilfreich. Das Ausführen der entsprechenden Provider-Befehle als Nuget-Pakete in der Package Manager-Konsole kann das Problem lösen, da auch NuGet-Pakete automatisch Registrierungen zur Konfigurationsdatei hinzufügen. Ich rannte PM> Install-Package EntityFramework.SqlServerCompact, um das Problem zu lösen.

MaySara
quelle
2
Ich bin wirklich erstaunt, dass bisher niemand dafür gestimmt hat! In der Fehlermeldung wird klar angegeben: Der Grund für den Fehler ist, dass nach dem EF-Upgrade in der Datei web.config der Anwendung wirklich keine Anbieterdefinition für SQL Compact mehr vorhanden ist! Durch Hinzufügen des von Ihnen erwähnten Pakets wird die Datei web.config korrigiert, und es wird ein Anbieter definiert.
Csaba Toth
1
einfach Lebensretter. Es sollte als Antwort markiert werden, da es eindeutig eine Lösung für das Problem bietet
ZafarYousafi
7

Dieses Problem ist heute aufgetreten, als ich mit einer Reihe von Webdiensten in unterschiedlichen Projekten und einem separaten Projekt mit Integrationstests für einige dieser Dienste gearbeitet habe.

Ich verwende dieses Setup seit einiger Zeit mit EF5, ohne Verweise auf EF aus dem Integrationstestprojekt einfügen zu müssen.

Jetzt, nach dem Upgrade auf EF6, muss ich anscheinend auch einen Verweis auf EF6 in das Integrationstestprojekt aufnehmen, obwohl es dort nicht verwendet wird (so ziemlich wie oben von user3004275 ausgeführt ).

Anzeichen dafür, dass Sie vor dem gleichen Problem stehen:

  • Aufrufe direkt an EF (Herstellen einer Verbindung zu einer Datenbank, Abrufen von Daten usw.) funktionieren einwandfrei, sofern sie von einem Projekt initiiert werden, das Verweise auf EF6 enthält.
  • Anrufe an den Dienst über eine veröffentlichte Dienstschnittstelle funktionieren einwandfrei. dh es fehlen keine Referenzen "intern" im Service.
  • Aufrufe von öffentlichen Projekten im Serviceprojekt von einem Projekt außerhalb des Service verursachen diesen Fehler, obwohl EF in diesem Projekt selbst nicht verwendet wird. nur intern im aufgerufenen Projekt

Der dritte Punkt hat mich für eine Weile abgeworfen, und ich bin mir immer noch nicht sicher, warum dies erforderlich ist. Das Hinzufügen einer Referenz zu EF6 in meinem Integrationstest-Projekt hat es auf jeden Fall gelöst ...

Kjartan
quelle
7

Wenn der Fehler in Testprojekten auftritt, besteht die schönste Lösung darin, die Testklasse zu dekorieren mit:

[DeploymentItem("EntityFramework.SqlServer.dll")]
Alberto Juan
quelle
Es ist zwar hübsch, erzeugt aber mehr Arbeit und ist leichter zu vergessen. Mit dem Trick "erzwungene Referenz" müssen Sie dies nur für die Projekte tun, die EF wirklich verwenden müssen.
Charles Roberto Canato
7

Das Startprojekt, das auf das Projekt verweist, in dem Entity Framework verwendet wird, benötigt die folgenden zwei Assemblys in seinem bin-Ordner:

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

Durch Hinzufügen von a <section>zur <configSections>Datei .config im Startprojekt wird die erste Assembly in diesem bin-Verzeichnis verfügbar. Sie können dies aus der .config-Datei Ihres Entity Framework-Projekts kopieren:

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

Um die zweite DLL im Ordner bin verfügbar zu machen, obwohl dies nicht praktikabel ist, kann eine manuelle Kopie aus dem Ordner bin des Entity Framework-Projekts erstellt werden. Eine bessere Alternative besteht darin, den Post-Build-Ereignissen des Entity Framework-Projekts die folgenden Zeilen hinzuzufügen, die den Prozess automatisieren:

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\
Leonel B.
quelle
2
Vielen Dank, ich habe ein Entity-Framework in einer Datenschicht, so dass es isoliert ist, aber es ist bedauerlich, dass Microsoft es uns nicht erlaubt, die Datenschicht wirklich zu isolieren, und uns dazu bringt, den UX mit einer Datenbanktechnologie zu verschmutzen. Ich hatte gehofft, dass ich das nicht tun müsste.
Matt
4

Ich bin heute gerade auf dieses Problem gestoßen. Ich habe eine Datenrepository-Klassenbibliothek mit EF63 NuGet-Paket und Konsolenanwendung zum Testen, die nur auf Klassenbibliotheksprojekte verweisen. Ich habe einen sehr einfachen Post-Build-Befehl erstellt, der EntityFramework.SqlServer.dll aus dem Ordner Bin \ Debug der Klassenbibliothek in den Ordner Bin \ Debug der Konsolenanwendung kopiert und das Problem behoben hat. Vergessen Sie nicht, den Abschnitt entityFramework zur .config-Datei der Konsolenanwendung hinzuzufügen.

Ondřej
quelle
4

Fügen Sie unten zu Ihrer app.config hinzu.

 <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>
Taran
quelle
Sie müssen es auch registrieren, um <configSections>-<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
TryingToImprove
Dies ist, was "IInstall-Package EntityFramework" tut. Dies ist nicht unbedingt erforderlich, da EntityFramework standardmäßig versucht, EntityFramework.SqlServer.dll für den invarianten SqlClient-Namen zu laden. Diese Methode kann verwendet werden, um den Anbieter zu ersetzen.
user1295211
3

Das Löschen des BIN-Ordners hat es für mich getan

David
quelle
3

Sie sollten einen statischen Verweis auf die Assembly EntityFramework.SqlServer.dll erzwingen , aber anstatt einen Dummy-Code einzufügen , können Sie dies auf eine schönere Weise tun:

  1. Wenn Sie bereits eine DbConfiguration- Klasse haben:

    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        }
    }
  2. Wenn Sie keine DbConfiguration- Klasse haben, müssen Sie beim Start der App den folgenden Code eingeben (bevor EF verwendet wird):

    static MyContext()
    {
        DbConfiguration.Loaded += (sender, e) =>
            e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
Rosberg Linhares
quelle
2

Ich habe gerade das Entity Framework mit Nuget neu installiert. Befolgen Sie die Anweisungen unter dem folgenden Link: http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

Ich denke, das Problem wird gelöst.

Kuntal Ghosh
quelle
Eine Erklärung wäre schön! Warum müssen Sie es neu installieren und so weiter
Rizier123
1
Da die Änderungen aus unbekannten Gründen nicht wirksam werden, habe ich EntityFramework 6.1.1 neu installiert und danach wirksam.
Kuntal Ghosh
2

Erweitern Sie die Datei YourModel.edmx und öffnen Sie die Klasse YourModel.Context.cs unter YourModel.Context.tt.

Ich habe die folgende Zeile im Abschnitt "using" hinzugefügt und der Fehler wurde für mich behoben.

using SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

Möglicherweise müssen Sie diese Zeile jedes Mal zur Datei hinzufügen, wenn die Datei automatisch generiert wird.

user2347528
quelle
2

Ich hatte auch ein ähnliches Problem. Mein Problem wurde wie folgt gelöst:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

BehrouzMoslem
quelle
2

Es sieht so aus, als hätte niemand erwähnt, dass zuerst geprüft wurde, ob System.Data.SqlClient im System installiert ist und ob darauf verwiesen wird.

Ich habe mein Problem gelöst, indem ich System.Data.SqlClient installiert und einen neuen Anbieter in app.Config hinzugefügt habe

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
Tobi Owolawi
quelle
1

Stellen Sie außerdem sicher, dass Ihr Startprojekt das Projekt ist, das Ihren Datenbankkontext (oder die relevante app.config) enthält. Meins hat versucht, ein Website-Projekt zu starten, das nicht über alle erforderlichen Konfigurationseinstellungen verfügt.

user2588362
quelle
1

Ich habe fast alles versucht und nichts hat funktioniert.

Erst als ich die referenzierten DLLs im Standardprojekt EntityFrameworkund in den EntityFramework.SqlServerEigenschaften so eingestellt habe Copy Local, Truedass es funktioniert!

SharpC
quelle
1

Ich brauche Ihre Aufmerksamkeit. Achtung, dass zwei DLLs EntityFramework.dll und EntityFramework.SqlServer.dll DataAccess-Ebenenbibliothek sind. Es ist nicht logisch, sie in der Ansicht oder einer anderen Ebene zu verwenden. Es löst Ihr Problem, aber es ist nicht logisch.

Der logische Weg ist, dass das enitiess-Attribut sie entfernt und durch Fluent API ersetzt. Dies ist eine echte Lösung

Vahid Akbari
quelle
1

Ich hatte eine Konsolenanwendung und eine Klassenbibliothek. In der Klassenbibliothek habe ich ein Entitätsdatenmodell erstellt (Rechtsklick auf Klassenbibliothek> Hinzufügen> Neues Element> Daten> ADO.NET-Entitätsdatenmodell 6.0) und eine Referenz in die Konsolenanwendung eingefügt. Sie haben also eine Konsolenanwendung, die auf die Klassenbibliothek verweist, und innerhalb der Klassenbibliothek haben Sie ein EF-Modell. Ich hatte den gleichen Fehler, als ich versuchte, einige Datensätze aus der Tabelle zu erhalten.

Ich habe dieses Problem folgendermaßen behoben:

  1. Klicken Sie mit der rechten Maustaste auf die Lösung und wählen Sie die Option "NuGet-Pakete für Lösung verwalten". Das Fenster "NuGet-Paketmanager" wird angezeigt.
  2. Gehen Sie zur Option "Verwalten" unter "Installierte Pakete". TIPP: Entity Framework wurde zur Klassenbibliothek hinzugefügt, sodass Sie EntityFramework unter "Installierte Pakete" haben und die Option "Verwalten" sehen
  3. Klicken Sie auf die Option 'Verwalten' und aktivieren Sie das Kontrollkästchen, um das Paket in einem Projekt zu installieren, das einen Verweis auf die Klassenbibliothek enthält, die das EF-Modell enthält.

Das war alles was ich tun musste und alles hat perfekt funktioniert.

Ich hoffe es hat geholfen.

dkkd
quelle
1

Ich habe den gleichen Fehler. Es ist seltsam, dass es nur passiert, wenn ich meinen dbContext verwendet habe, um nach einem meiner Modelle abzufragen oder seine Liste wie folgt abzurufen:

var results = _dbContext.MyModel.ToList();

Wir haben versucht, das Entity Framework neu zu installieren, es richtig zu referenzieren, aber ohne Erfolg.

Glücklicherweise haben wir versucht, das Nuget auf ALLLösungen zu überprüfen , dann alles zu aktualisieren oder sicherzustellen, dass everythinges dieselbe Version ist, da wir festgestellt haben, dass die beiden Projekte unterschiedliche EF-Versionen im Webprojekt haben. Und es funktioniert. Der Fehler ist weg.

Hier ist der Screenshot zum Verwalten von Nuget für alle Lösungen:

Geben Sie hier die Bildbeschreibung ein

Willy David Jr.
quelle
1

Sie vermissen nur einen Verweis auf EntityFramework.SqlServer.dll. Bei EntityFramework-Projekten mit SQL Server müssen Sie auf die beiden Dateien EntityFramework.SqlServer.dll und EntityFramework.dll verweisen

user2956314
quelle
0

Ich hatte ein verwandtes Problem bei der Migration von einer CE-Datenbank auf SQL Server unter Azure. Ich habe gerade 4 Stunden damit verbracht, dies zu lösen. Hoffentlich kann dies jemandem ein ähnliches Schicksal ersparen. Für mich hatte ich einen Verweis auf SqlCE in meiner Datei packages.config. Durch das Entfernen wurde mein gesamtes Problem behoben und ich konnte Migrationen verwenden. Yay Microsoft für eine andere Technologie mit unnötig komplexen Setup- und Konfigurationsproblemen.

user2662643
quelle
0

Ich hatte das gleiche Problem, habe nur die App Config-Datei aus dem Projekt, das den DBContext enthielt, in mein Testprojekt kopiert

stephen ebichondo
quelle
0

Ich hatte die identische Ausnahme geworfen. Ich habe eingeschlossen

using System.Data; 
using System.Data.Entity;

und alles funktioniert wieder ..

Kneerunjun
quelle
0

Wie die Nachricht zeigt, müssen wir den Anbieter System.Data.SqlClient hinzufügen. Deshalb müssen wir das Nuget-Paket von EntityFramework mit zwei DLLs installieren. Wenn wir jedoch nur eine Konsolenanwendung entwickeln, müssen wir nur die Referenz von EntityFramework.SqlServer.dll hinzufügen

Sandeep Shekhawat
quelle