Entity Framework Provider-Typ konnte nicht geladen werden?


420

Ich versuche, meine Tests in TeamCity auszuführen, das derzeit auf meinem Computer installiert ist.

System.InvalidOperationException::

Das Entity Framework Provider - Typ ‚ für die‘ 'ADO.NET - Provider konnte nicht geladen werden. Stellen Sie sicher, dass die Provider-Assembly für die ausgeführte Anwendung verfügbar ist.System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServerVersion=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'System.Data.SqlClient

Weitere Informationen finden Sie unter http://go.microsoft.com/fwlink/?LinkId=260882 .

Ich habe System.Data.Entityin keinem meiner Projekte einen Verweis darauf, wie er in Codeplex für ein Upgrade auf EF6 vorgeschlagen wurde.

Ich bin mir also nicht sicher, warum ich diese Ausnahme bekomme. Ich erhalte keine solche Ausnahme, wenn ich die Tests von VS aus starte.

Ich habe versucht, CopyLocal auf false und dann wieder auf true zu setzen. Aber das scheint auch nicht zu funktionieren.

Aktualisieren

Meine app.config hat folgendes. Verursacht dies ein Verhalten, das ich nicht verstehe?

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <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 -->
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

Ich bekomme den folgenden Stacktrace in Teamcity.

[MSTest] IntegrationTests.CrudTest+QuestionTest.Create
[03:59:11][IntegrationTests.CrudTest+QuestionTest.Create] Initialization method IntegrationTests.CrudTest+QuestionTest.Initialize threw exception. System.InvalidOperationException: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 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..
[03:59:11]
[IntegrationTests.CrudTest+QuestionTest.Create]     at System.Data.Entity.Config.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName)
   at System.Data.Entity.Config.ProviderServicesFactory.GetInstanceByConvention(String providerInvariantName)
   at System.Data.Entity.Config.DefaultProviderServicesResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.CachingDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 k)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Data.Entity.Config.CachingDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.RootDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.CompositeResolver`2.GetService(Type type, Object key)
   at System.Data.Entity.Config.IDbDependencyResolverExtensions.GetService[T](IDbDependencyResolver resolver, Object key)
   at System.Data.Entity.Config.InternalConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Config.DbConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Utilities.DbProviderFactoryExtensions.GetProviderServices(DbProviderFactory factory)
   at System.Data.Entity.Infrastructure.DefaultManifestTokenService.GetProviderManifestToken(DbConnection connection)
   at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at EFRepository.Infrastructure.EFRepository`1.Add(T item) in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\Repository\Infrastructure\EFRepository.cs:line 22
   at IntegrationTests.CrudTest.Initialize() in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\IntegrationTests\CrudTest.cs:line 34

1
Wird EntityFramework.SqlServer.dll zusammen mit EntityFramework.dll bereitgestellt? In EF6 befinden sich SqlServer- und SqlServerCE-Anbieter nicht in derselben Assembly wie die EF-Engine wie in früheren Versionen. Sie sollten keinen Verweis auf die System.Data.Entity.dll hinzufügen. Das Anbietermodell in EF6 wurde im Vergleich zu EF5 geändert, und der EF5-Anbieter funktioniert einfach nicht. Darüber hinaus können Sie einige knifflige Probleme (wie EF5 Geodaten, die in EF6 als Entitätstypen behandelt werden) treffen
Pawel

Ja, ich habe überprüft, ob kein Verweis auf System.Data.Entity vorhanden ist, und die Verweise auf EntityFramework.dll und EntityFramework.SqlServer.dll sind vorhanden. Wieder kompiliert und testet das Projekt in VS. Erst wenn die Tests auf TeamCity ausgeführt werden, tritt der Fehler auf.
Ashutosh Raina

Dies ist eine korrekte Einrichtung. Ich habe TeamCity nicht verwendet, aber es scheint mir, dass bei der Bereitstellung Ihrer App zum Ausführen der Tests mit TeamCity die EntityFramework.SqlServer.dll fehlt und daher die Ausnahme.
Pawel

1
Siehe die Antwort aus diesem Beitrag: stackoverflow.com/questions/21175713/… Ich habe die private volatile Type _dependency...Antwort hinzugefügt und es hat funktioniert! Es stinkt nur, dass ich eine separate Klasse wie diese hinzufügen muss, damit EF in TeamCity funktioniert.
a11smiles

2
Ich habe EntityFramework von Nuget-Paketen deinstalliert und erneut installiert und es wurde behoben
abhyudayasrinet

Antworten:


426

Gleiches Problem, aber ich habe EF 6 über Nuget installiert. EntityFramework.SqlServer fehlte für eine andere ausführbare Datei. Ich habe diesem Projekt einfach das Nuget-Paket hinzugefügt.


108
Das ist mir auch aufgefallen. Wenn Sie eine Bibliothek erstellen, die EF verwendet, legt VS die EF.dll und die EF.SqlServer.dll in diesem Build-Ordner ab. Wenn Sie jetzt ein anderes Programm haben, das Ihre Bibliothek verwendet, wird nur die EF.dll in diesen Build-Ordner gestellt. Die EF.SqlServer.dll fehlt. Wenn Sie es manuell zum Build-Ordner hinzufügen, funktioniert das Programm. Keine gute Lösung für sich, zeigt aber, dass das Problem darin besteht, dass die fehlende EF.SQLServer.dll die Ursache des Fehlers ist.
Eric

44
Ich habe var x = typeof hinzugefügt (System.Data.Entity.SqlServer.SqlProviderServices); Dann funktionierte meine App
Brian

33
Ich mache mir immer Sorgen, wenn ich Code eingebe, der absolut nichts bewirkt und plötzlich läuft mein Projekt. O_o
Jordan

10
Aufgrund der Compileroptimierung möchten Sie dies möglicherweise auch tun, da sonst x.ToString()das typeofs in Release entfernt wird.
Jordanien

15
Ich finde es ärgerlich, dass EF 6.1 jetzt EF auf meiner ASPX-DLL / meinem ASPX-Projekt installiert haben muss, während EF 5.0 es nur auf meiner Datenschicht-DLL / meinem Projekt benötigt.
PeterX

274

Ich hatte das gleiche Problem in meinen Testprojekten - ich habe die neuesten EF6-Bits über NuGet installiert und jedes Mal, wenn ich etwas EF-bezogenes aufrufe, habe ich:

Der Entity Framework-Anbietertyp 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' für den ADO.NET-Anbieter 'System.Data.SqlClient' konnte nicht geladen werden. Stellen Sie sicher, dass die Provider-Assembly für die ausgeführte Anwendung verfügbar ist. Weitere Informationen finden Sie unter http://go.microsoft.com/fwlink/?LinkId=260882 .

Meine Problemumgehung: Ich habe diese Methode in mein Testprojekt eingefügt:

public 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;
}

Diese Methode wurde nie aufgerufen, aber ich denke, der Compiler wird alle "unnötigen" Assemblys entfernen und ohne Verwendung des EntityFramework.SqlServer-Materials schlägt der Test fehl.

Sowieso: Funktioniert auf meiner Maschine;)

Hinweis: Anstatt die Methode zum Testen des Projekts hinzuzufügen, können Sie einen statischen Verweis auf SqlProviderServices aus Ihrem Modell- / Entitätsprojekt sicherstellen .


24
Am Ende habe ich das Gleiche getan. Ich möchte mit dieser Person sprechen, die diese Versammlung von der Eröffnung einer Verbindung zu db abhängig gemacht hat. In ihrem alternativen Universum sollten alle unsere Frontend-Projekte, die eine Konfigurationsdatei mit einer Verbindungszeichenfolge haben, auf EntityFramework verweisen, damit diese eine DLL die Verbindung öffnet. Inwiefern das Sinn macht, verstehe ich nicht.
juhan_h

3
Es ist ein Hack, aber es ist die beste / einfachste Lösung, die ich für das Szenario gefunden habe, in dem Sie kein Bereitstellungspaket für Ihr Projekt erstellt haben.
Kon

3
Für alle, die andere Vorschläge wie "var x = typeof (SqlProviderServices);" verwenden. Nur diese von Robert bereitgestellte Lösung arbeitet an der Entwicklung und dem Bau von Maschinen !!!
Alexander Schmidt

3
Danke Robert, es ist lächerlich vom EF-Team, aber das funktioniert trotzdem für mich.
Hitesh

7
Um es klar auszudrücken: Durch Hinzufügen des obigen Codes zu Ihrer DbContextKlasse wird das Problem in EF 6.1 gelöst. Auf diese Weise müssen Sie das Entity Framework Nuget-Paket nicht in Ihr Front-End-Projekt (WebApi usw.) aufnehmen und können alles, was mit EF zu tun hat, in Ihrer Datenschicht belassen.
Nick

106

Nuget konfiguriert Ihr EF6-Projekt so, dass es auf EntityFramework.SqlServer.dll verweist. Dies wird während der Erstellung im Ausgabeordner Ihres EF6-Projekts bereitgestellt, jedoch nicht im Ausgabeordner für Projekte, die auf Ihr EF6-Projekt verweisen. Ich glaube, das liegt daran, dass Visual Studio "intelligent" genug ist, um zu erkennen, dass nichts in Ihrer Assembly die DLL direkt verwendet und sie daher nicht enthält. Sie können die Bereitstellung von EntityFramework.SqlServer.dll im Ausgabeordner von Projekten erzwingen, die auf Ihr EF6-Projekt verweisen (Komponententests, Benutzeroberflächen usw.), indem Sie Ihrem EF6-Projekt, das EntityFramework.SqlServer.dll verwendet, Code hinzufügen. Achten Sie darauf, den Code nicht in eine generierte Klasse einzufügen, da Sie ihn bei der nächsten Regeneration verlieren können. Ich habe beschlossen, der Assembly die folgende Klasse hinzuzufügen, wodurch das Problem behoben wurde.

using System.Data.Entity.SqlServer;

internal static class MissingDllHack
{
    // Must reference a type in EntityFramework.SqlServer.dll so that this dll will be
    // included in the output folder of referencing projects without requiring a direct 
    // dependency on Entity Framework. See http://stackoverflow.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

1
Dies löste das Problem für mich in Bezug auf MSTest. Ich mag diese Methode, weil es nicht erforderlich ist, dass ich mit der Klassenvererbung in meinen Testklassen etwas Unordnung mache. Fügen Sie die Klasse einfach irgendwo in die Testbaugruppe und in MAGIC ein. Vielen Dank!
Kbrimington

Genau aus diesem Grund wird die Datei sqlserver.dll nicht in die Ausgabe des referenzierenden Projekts kopiert. Dies geschieht, wenn zwischen der Ausführung der Anwendung und der Kontextassemblierung eine weitere Ebene liegt. Danke, das hat mein Problem gelöst.
Bharat

2
Für diejenigen, die nicht 4 Sekunden damit verbringen möchten, nachzuschlagen: using System.Data.Entity.SqlServer;
TTT

Wir verwenden eine gemeinsame Basisklasse für Komponententests. Alle Komponententests erben von dieser Klasse. Das Hinzufügen dieser Methode zu dieser einen Klasse bedeutet, dass alle Projekte mit einer Unit-Test-Klasse, die von der Basisklasse erbt, einwandfrei funktionieren.
MaxJ

3
Kleiner Punkt, aber es ist wahrscheinlich am besten, dieser Klasse einen Kommentar hinzuzufügen, um zu erklären, warum dies notwendig ist.
John Darvill

43

Meine Lösung bestand darin, das Entity-Framework über den Nuget-Manager aus dem Projekt zu entfernen und wieder hinzuzufügen.


9
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
VahidN

Das hat für mich
geklappt

Einfache, saubere Lösung, die funktioniert. Sollte viel höher auf der Liste sein
mode777

29

Ich habe dies gelöst, indem ich ein using-Stament über meine DBContext-Klasse hinzugefügt habe, wie folgt:

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

1
Dies ist die sauberste Lösung für dieses Problem. Vielen Dank.
Alexandru Dicu

Diese Lösung funktioniert und sieht sauber aus. Frage: Verlieren wir nicht die Zeilen-ID, mit der die DBContext-Klasse aktualisiert wird? dh mit der edmx-Klassengenerierung?
NoloMokgosi

Ich kann nicht glauben, dass dies notwendig war und irgendwie nicht von Microsoft korrigiert wurde - aber das hat bei mir funktioniert. Vielen Dank für eine einfache Lösung.
Zar Bomba

Diese Lösung ist funktional dieselbe wie MissingDllHack . Es mag sauberer erscheinen, führt jedoch Workaround-Code in Ihre Kontextklasse ein. Dieser Code wird auch zum Entfernen durch Tools wie ReSharper markiert und kann im Laufe der Zeit leicht verloren gehen. Eine gute Lösung, aber ich bevorzuge es, die Problemumgehung so vom Kontext zu trennen, dass keine Code-Warnungen erzeugt werden.
Timothy Schoonover

20

Ich habe die Code-basierte Registrierung für den Anbieter verwendet. link1 link2

Habe gerade die Konfigurationsklasse wie erstellt

class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

Der entscheidende Punkt ist this.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);

und benutzte es so

[DbConfigurationType(typeof(DbContextConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        ...
    }

    public DbSet<...> ...{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
    }
}

Ich habe zwei Projekte in einer Lösung. Die erste ist die Klassenbibliothek mit der Entity-Framework-Assembly und der DbContext-Klasse sowie den tt-Dateien. Das zweite Projekt sind Windows-Formulare, die mithilfe des ef-Projekts Daten abrufen sollen. @Nash: Könnten Sie näher erläutern, wo (in welchem ​​Projekt) Sie Ihre Klasse platziert haben DbContextConfiguration? Danke
surfmuggle

Wie oben erwähnt, scheinen zusätzliche Referenzen eine Möglichkeit zu sein, dies zu beheben (siehe Kommentar von Eric). Ich habe die Nuget-Konsole verwendet und diesen Befehl ausgelöst, Get-Project MyWinformsProject | Install-Package EntityFrameworkder ihn für mich behoben hat. Trotzdem möchte ich den Grund besser verstehen.
Surfmuggle

DbContextConfiguration schien bereits vorhanden zu sein (gegenüber 2013). Das Hinzufügen der DbConfiguraton-Zeile über meiner MyDbContext-Klasse löste das Problem für mich nicht.
Anders Lindén

Sie benötigen keine DbConfiguration- Klasse. Geben Sie beim Start der App den folgenden Code ein (bevor EF verwendet wird) : DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);.
Rosberg Linhares

14

Ich habe es mit [DeploymentItem] in meiner Assembly-Initialisierungsklasse aussortiert

namespace MyTests
{
    /// <summary>
    /// Summary description for AssemblyTestInit
    /// </summary>
    [TestClass]
    [DeploymentItem("EntityFramework.SqlServer.dll")]
    public class AssemblyTestInit
    {
        public AssemblyTestInit()
        {
        }

        private TestContext testContextInstance;

        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        [AssemblyInitialize()]
        public static void DbContextInitialize(TestContext testContext)
        {
            Database.SetInitializer<TestContext>(new TestContextInitializer());
        }
    }
}

9

Spät zur Party, aber die Antworten mit den besten Stimmen schienen mir alle Hacks zu sein.

Ich habe im Testprojekt lediglich Folgendes aus meiner app.config entfernt. Hat funktioniert.

  <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 echte Lösung!
Ben F

8

Ich habe ein Problem, weil ich keinen Verweis auf EntityFramework.sqlServer.dll hinzufüge. Wenn ich ein Programm entwickle, funktioniert es. Aber wenn ich die App veröffentliche und installiere, wird ein Fehler ausgegeben.

Ich füge nur eine Referenz hinzu und erstelle und veröffentliche erneut.

Verweise


Ich habe das gemacht und es hat funktioniert. Grundsätzlich zeigt das Projekt eine Warnung an, wenn die Komponenten in den Bibliotheken nicht ordnungsgemäß referenziert wurden.
Kbvishnu

5

Ich habe dies gelöst, indem ich die EntityFramework.SqlServer.dllDatei manuell in die bin folderHauptanwendung kopiert habe .


4

Ich habe das endlich gelöst. Es stellte sich heraus, dass ich eine fehlerhafte Implementierung von IDIsposable in meiner Repository-Klasse hatte. Ich habe das behoben. Die fehlerhafte Implementierung verursachte eine Stackoverflow-Ausnahme, da ich die Ressourcen nicht ordnungsgemäß entsorgte. Dies führte dazu, dass VS die Tests nicht ausführte und die Testausführungs-Engine abstürzte.

Ich habe es hier bei Microsoft eingereicht (dies war, bevor ich die richtige Lösung bekam). connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details

Wie auch immer, die Builds laufen jetzt gut in Teamcity. Trotzdem bin ich immer noch neugierig, warum keine der VS Test-Ausführungsmodule mir auf anmutige Weise mitteilte, was geschah, nicht Team City.

Ich habe die Grundursache durch manuelles Debuggen des Tests entdeckt (was ich erst nach so vielen Tagen erkannte, dass die Korrektur 5 Sekunden dauerte).

Hoffentlich hilft dies jemandem, der auf solche Probleme stößt.


4

Ich sehe ein ähnliches Problem und verwende die Methode aus diesem Beitrag: ( http://entityframework.codeplex.com/workitem/1590 ), die mein Problem löst.

Um das Problem zu umgehen, können Sie Ihre Testassembly direkt auf die Provider-Assembly verweisen lassen, indem Sie an einer beliebigen Stelle in der Testassembly eine Zeile wie diese hinzufügen: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;


3

Als ich das Problem untersuchte, habe ich festgestellt, dass die folgende DLL im Ausgabeordner fehlte. Die einfache Lösung besteht darin, Entityframework.dll und Entityframework.sqlserver.dll mit der app.config in den Ausgabeordner zu kopieren, wenn sich die Anwendung im Debug-Modus befindet. Gleichzeitig ändern Sie den Build-Optionsparameter "In Ausgabeordner kopieren" von app.config, um immer zu kopieren. Dies wird Ihr Problem lösen.


2
Ich habe "Copy Local" true nur für "EntityFramework.SqlServer" eingerichtet. Jetzt funktioniert es.
Alezis

3

Verweisen oder durchsuchen Sie einfach die EF-DLL - EntityFramework.SqlServer.dll


Das habe ich getan. Der Verweis auf "EntityFramework.SqlServer" wurde aus meiner Bibliothek in das "laufende" Projekt kopiert. Das hat funktioniert!
Håkon K. Olafsen

3

Ich hatte das gleiche Problem, das ich viele Male versucht habe, aber es wurde nicht behoben, aber als ich das Paket EntityFramework.SqlServerCompact installierte, löste es dieses Paket aus dem Nuget-Paket-Manager.

Install-Package EntityFramework.SqlServerCompact

3

Ich habe eine statische "Start" -Datei erstellt und den Code hinzugefügt, um zu erzwingen, dass die DLL in den darin enthaltenen bin-Ordner kopiert wird, um diese 'Konfiguration' zu trennen.


[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }

public class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        // This is needed to force the EntityFramework.SqlServer DLL to be copied to the bin folder
        SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}


1
Vielen Dank! Das war eine große Hilfe.
Addison Schuhardt

1
Ich bin froh, dass du meine Antwort hilfreich gefunden hast @AddisonSchuhardt :)
hatsrumandcode

2

Ich wollte in meinem Anwendungsprojekt keinen Verweis auf EF (oder etwas manuell kopieren), also habe ich diesen zu den Post-Build-Ereignissen meines EF-Projekts hinzugefügt:

cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}

2

Dies geschieht nur in meinen Last- / Unit-Testprojekten. Frustrierend, ich habe es in einem Projekt gesehen, das ich seit 2 Jahren leite. Muss eine Testreihenfolge gewesen sein, die die Dinge kaputt macht. Ich denke, sobald diese Fi entfernt wird, ist sie weg.

Ich habe festgestellt, dass das einfache Deklarieren einer Variablen, die den richtigen Wert verwendet, das Problem behebt ... Ich rufe die Methode nie auf. Definieren Sie es einfach. Seltsam, aber es funktioniert.

    /// <summary>
    /// So that the test runner copies dlls not directly referenced by the integration project
    /// </summary>
    private void referenceLibs()
    {
        var useless = SqlProviderServices.Instance;
    }

2

Nachdem ich alle anderen Lösungsvorschläge ausprobiert hatte und mein Projekt nicht zum Laufen gebracht hatte, fand ich auf dieser Seite endlich einen kleinen Kommentar :

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

Und es hat auch bei mir funktioniert.


1
Ich habe zwei Zweige zusammengeführt - mein Projekt hatte keine Änderungen in Bezug auf EF, aber meine Unittests scheiterten ohne Grund. Durch das Löschen des BIN-Ordners funktionierten sie wieder.
Arno Peters

@ Zeek2 Dieser Fehler ist schwierig. Auf der von mir zitierten Seite gibt es viele verschiedene Vorschläge zur Lösung dieses Problems. Dies ist nur eine von vielen möglichen Lösungen. Recherchieren Sie weiter, bis Sie die Lösung gefunden haben, die für Ihr spezielles Problem gilt, und viel Glück.
Ulysses Alves

1

Das Hinzufügen von Entityframework.dll und Entityframework.sqlserver.dll zum Referenzprojekt löste das Problem.


1

Ich habe das Fenster Debug-Ausgabe im Unit-Test-Projekt überprüft. EntityFramework.SqlServer.dll wurde nicht geladen. Nach dem Hinzufügen zum Bin-Ordner wurden die Tests erfolgreich ausgeführt.



1

Ich hatte das gleiche Problem mit der Instanziierung eines DBContextObjekts aus einem Unit-Test-Projekt. Ich habe meine Unit-Test-Projektpakete überprüft und das herausgefundenEntityFramework Paket nicht installiert ist. Ich habe es von Nuget installiert und das Problem behoben (ich denke, es ist ein EF-Fehler).

fröhliche Codierung


0

Ich hatte gerade die gleiche Fehlermeldung.

Ich habe ein separates Projekt für meinen Datenzugriff. Das lokale Ausführen des Webprojekts (das auf das Datenprojekt verwies) funktionierte einwandfrei. Als ich das Webprojekt zum Azure der Assembly bereitstellte, wurde EntityFramework.SqlServer nicht kopiert. Ich habe gerade den Verweis auf das Webprojekt hinzugefügt und erneut bereitgestellt, jetzt funktioniert es.

hoffe das hilft anderen


0

Ich habe offline am Tutorial der Contoso University gearbeitet und bin auf dasselbe Problem gestoßen, als ich versucht habe, meinen ersten Controller mit EF zu erstellen. Ich musste die Package Manager-Konsole verwenden, um EF aus dem Nuget-Cache zu laden, und eine Verbindungszeichenfolge zu meiner lokalen Instanz von SQL Server erstellen. Mein Punkt hier ist, dass meine webConfig-Einstellung für EF möglicherweise nicht wie Sie alle da draußen festgelegt wurde, aber ich konnte um mein Problem zu beheben, indem Sie den Abschnitt "Anbieter" in "entityFramework" vollständig löschen.

Robert


0

Es gibt eine einfache Lösung. Öffnen Sie die Referenzen in Ihrem Projekt und klicken Sie mit der rechten Maustaste auf "System.Data" -> Eigenschaften. Ändern Sie "Copy Local" in "True".

Problem sollte behoben sein.


0

In meinem Fall habe ich das Problem durch die Installation von SQL Server 2012 Developer Edition behoben, als ich zuvor SQL Server Express 2012 (x64) installiert hatte. Es scheint, dass ich die fehlende Abhängigkeit hatte.


0

Entfernen Sie das Entity-Framework über Nuget aus dem Projekt und fügen Sie es wieder hinzu.


0

In meinem Fall dllwurde nicht kopiert, obwohl ich einen Verweis darauf hinzugefügt habe. Dies liegt daran, dass EntityFramework.SqlServer.dllnicht in Ihr Projekt kopiert wird. Fügen Sie diese DLL hinzu und es wird hoffentlich funktionieren. Sie finden sie in dem Projekt, in dem Sie das Datenmodell hinzugefügt haben.


0

Wenn Sie EF 6.1.3 verwenden, stellen Sie zusätzlich zu allen nützlichen Vorschlägen sicher, dass die .net-Version Ihres Projekts 4.5 oder höher ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.