it-swarm.com.de

Entity Framework Provider-Typ konnte nicht geladen werden?

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

System.InvalidOperationException

Der Entity Framework-Anbietertyp 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' für den' System.Data.SqlClient' ADO.NET-Provider konnte nicht geladen werden. Stellen Sie sicher, dass der Provider Assembly steht der laufenden Anwendung zur Verfügung. 

Siehe http://go.Microsoft.com/fwlink/?LinkId=260882 für weitere Informationen Information..

Ich habe in keinem meiner Projekte auf System.Data.Entity Bezug, wie auf Codeplex für das Upgrade auf EF6 vorgeschlagen wurde.

Ich bin mir also nicht sicher, warum ich diese Ausnahme bekomme ... Ich bekomme keine solche Ausnahme, wenn ich die Tests von VS durchführe.

Ich habe versucht, CopyLocal auf false zu setzen, dann wieder auf true .. 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
383
ashutosh raina

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

393
Zapacila

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 Element anrief, bekam ich

Der Entity Framework-Anbietertyp 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer 'für ADO.NET .__ des' System.Data.SqlClient '. Provider konnte nicht geladen werden. Stellen Sie sicher, dass die Provider-Assembly .__ ist. für die laufende Anwendung verfügbar. Sehen http://go.Microsoft.com/fwlink/?LinkId=260882 Weitere Informationen.

Mein Workaround: 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. Ohne die EntityFramework.SqlServer-Dateien schlägt der Test fehl. 

Sowieso: Funktioniert auf meiner Maschine;)

Anmerkung: Anstatt die Methode zum Testen des Projekts hinzuzufügen, können Sie eine statische Referenz auf SqlProviderServices aus Ihrem Model/Entity-Projekt sicherstellen.

259
Robert Muehsig

Nuget konfiguriert Ihr EF6-Projekt so, dass es auf EntityFramework.SqlServer.dll verweist. Dies wird während des Builds im Ausgabeordner für Ihr EF6-Projekt bereitgestellt, aber 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 (Gerätetests, Benutzeroberflächen usw.), indem Sie Ihrem EF6-Projekt Code hinzufügen, der EntityFramework.SqlServer.dll verwendet. Achten Sie darauf, den Code nicht in eine generierte Klasse einzufügen, da Sie ihn bei der nächsten Regeneration verlieren könnten. Ich entschied mich, 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;
}
98

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

40
Kevbo

Ich habe dieses Problem gelöst, indem ich wie folgt eine using-Anweisung über meiner DBContext-Klasse eingefügt habe:

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

Ich habe Code-basierte Registrierung für Provider verwendet . link1link2

Soeben erstellt die Konfigurationsklasse gerne

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

Schlüsselpunkt ist this.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);

und benutzte es auf diese Weise

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

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

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

Ich habe es mit [DeploymentItem] in meiner Assembly-Initialisierungsklasse gelöst

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());
        }
    }
}
14
Random

Spät zur Party, aber die Antworten mit den besten Antworten waren für mich wie Hacks.

Alles was ich getan habe, war folgendes aus meiner app.config im Testprojekt zu entfernen. 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>
9
jeriley

Ich habe ein Problem, da ich keinen Verweis auf EntityFramework.sqlServer.dll .. hinzufüge. Wenn ich jedoch die App veröffentliche und installiere, wird ein Fehler ausgegeben.

Ich füge nur einen Verweis hinzu und baue erneut auf.

References

7
Matej

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 den Provider Assembly verweisen lassen, indem Sie an einer beliebigen Stelle der Testassembly eine Zeile wie diese hinzufügen: Var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

4
Innovation Wang

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äß entsorgt hatte. Dies führte dazu, dass VS die Tests nicht ausführte und die Testausführungs-Engine abstürzte. 

Ich habe es hier bei Microsoft abgelegt (dies war, bevor ich die richtige Lösung gefunden hatte)

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

Ich entdeckte die Hauptursache durch manuelles Debuggen des Tests (was mir erst nach so vielen Tagen klar wurde, dass der Fix 5 Sekunden dauerte).

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

4
ashutosh raina

Ich habe dieses Problem gelöst, indem Sie die EntityFramework.SqlServer.dll-Datei manuell in den bin folder der Hauptanwendung kopieren.

4
Sreeja Sj

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

3
yogihosting

Ich habe eine statische "Start" -Datei erstellt und den Code hinzugefügt, um das Kopieren der DLL in den Bin-Ordner zu erzwingen, 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);
    }
}
</ code>
3
hatsrumandcode

Bei der Überprüfung des Problems habe ich festgestellt, dass folgende Ausgabe-DLL im Ausgabeordner fehlte. Die einfache Lösung ist, Entityframework.dll und Entityframework.sqlserver.dll mit der Datei app.config in den Ausgabeordner zu kopieren, wenn sich die Anwendung im Debug-Modus befindet. Gleichzeitig ändern Sie den Build-Options-Parameter "In Ausgabeordner kopieren" von app.config, um immer zu kopieren. Dies löst Ihr Problem.

Ich hatte dasselbe Problem, das ich viele Male ausprobiert habe, aber es wurde nicht behoben. Wenn ich jedoch das Paket EntityFramework.SqlServerCompact installiere, wurde dieses Paket vom Nuget-Paket-Manager installiert.

Install-Package EntityFramework.SqlServerCompact
3
Alishan

Dies geschieht nur in meinen Lade-/Gerätetestprojekten. Ich bin frustrierend, ich habe es in einem Projekt, das ich seit zwei Jahren leite, aufgetaucht. Es muss eine Reihe von Testläufen gewesen sein, die die Dinge kaputt machen. Ich denke, sobald der fi entfernt ist, ist er weg. 

Ich habe festgestellt, dass das Problem durch das Deklarieren einer Variablen, die den richtigen Wert verwendet, behoben wird. Ich rufe die Methode niemals auf. Definiere 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
hal9000

Ich wollte keinen Verweis auf EF in meinem Anwendungsprojekt (oder etwas manuell kopieren), also fügte ich dies den Postbuild-Ereignissen meines EF-Projekts hinzu:

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

Ich habe das Debug-Ausgabe-Fenster 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
yW0K5o

Durch das Hinzufügen von Entityframework.dll und Entityframework.sqlserver.dll zum Referenzprojekt wurde das Problem behoben.

1
Nish

Ich hatte auch ein ähnliches Problem

Mein Problem wurde folgendermaßen gelöst:

 enter image description here

 enter image description here

1
BehrouzMoslem

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

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

Und es hat auch für mich funktioniert. 

Jetzt kann ich nicht sagen, ob Sie nur den bin-Ordner löschen müssen. Er funktioniert bereits oder Sie müssen zuerst die von den anderen Entwicklern vorgeschlagenen Schritte ausführen. Der Punkt ist jedoch, dass ich ihn erst nach dem Löschen des Ordners zum Laufen gebracht habe bin Ordner, und dies nach 3 oder mehr Stunden, um andere Lösungen zu suchen und auszuprobieren. Vielleicht funktioniert es auch für Sie.

1
Ulysses Alves

In meinem Fall habe ich das Problem durch Installieren von SQL Server 2012 Developer Edition behoben, als ich SQL Server Express 2012 (x64) zuvor installiert hatte. Es scheint, dass ich mit der fehlenden Abhängigkeit versorgt bin.

0
Farrukh Najmi

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

Problem sollte behoben sein.

0
ChinaHelloWorld

Klicken Sie auf Verweis> Überprüfen Sie, ob EntityFramework-Referenz vorhanden ist oder nicht  

Falls nicht verfügbar Add it 

Klicke auf 

Referenz hinzufügen> Entitäts-Framework hinzufügen 1) EntityFrameWork 2) EntityFrameWork.SqlServer

0
Siddhartha

Wenn Sie EF 6.1.3 verwenden, stellen Sie zusätzlich zu allen nützlichen Vorschlägen sicher, dass die .net-Version Ihres Projekts mindestens 4.5 beträgt.

0

Ich hatte das gleiche Problem mit dem Instantiating DBContext-Objekt aus einem Komponententestprojekt. Ich habe meine Unit-Test-Projektpakete überprüft und festgestellt, dass das EntityFramework-Paket nicht installiert war. Ich habe das von Nuget installiert und das Problem gelöst (ich denke, es ist ein EF-Fehler).

glückliche Kodierung 

0
Code_Worm

Stellen Sie sicher, dass EntityFramework.dll, EntityFramework.SqlServer.dll und die DLL Ihres Providers (für SQL Server Compact die EntityFramework.SqlServerCompact.dll) im bereitgestellten Anwendungsordner sind. Dies ist besonders wichtig für die bereitgestellte Anwendung.

0
falopsy

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

0
Baqer Naqvi

Ich hatte genau das gleiche Problem auf meinem CI-Build-Server (auf dem Bamboo ausgeführt wurde), auf dem kein Visual Studio IDE installiert ist.

Ohne Codeänderungen für den Build/Test-Prozess vorzunehmen (was ich nicht für eine gute Lösung halte), ist es am besten, den EntityFramework.SqlServer.dll zu kopieren und in C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE einzufügen. (wo dein mstest läuft)

Problem gelöst!

0
Kelvin

Ich hatte gerade die gleiche Fehlermeldung.

Ich habe ein separates Projekt für meinen Datenzugriff. Das Ausführen des Webprojekts (das auf das Datenprojekt verwies) lokal funktionierte einwandfrei. Bei der Bereitstellung des Webprojekts in Azure der Assembly: EntityFramework.SqlServer wurde jedoch nicht kopiert. Ich habe gerade den Verweis zum Webprojekt hinzugefügt und neu implementiert, jetzt funktioniert es. 

hoffe das hilft anderen

0
pastrami01

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

0
Griffo

In meinem Fall bestand das Problem darin, dass ich, um eine andere Ausnahme abzufangen, CLL-Ausnahmen (Common Language Runtime) aktiviert hatte. Und ich habe vergessen, es zu deaktivieren.

Ich habe es in meiner Ausnahmeeinstellung deaktiviert. und es übersah diese Ausnahme und fuhr fort, eine DB für mich (in meinem Fall) automatisch zu erstellen.

0
Blue Clouds

Ich arbeitete offline an dem Contoso University-Lernprogramm und hatte das gleiche Problem, als ich versuchte, meinen ersten Controller mit EF .. zu erstellen. Ich musste die Package Manager Console verwenden, um EF aus dem Nuget-Cache zu laden, und erstellte eine Verbindungszeichenfolge für mein lokales System Instanz von SQL Server, mein Punkt hier ist, dass meine webConfig-Einstellung für EF möglicherweise nicht wie Sie alle festgelegt wurde, aber ich konnte mein Problem beheben, indem der Abschnitt "provider" in "entityFramework" vollständig gelöscht wurde.

Robert

0
Robert K