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.SqlServer
Version=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.Entity
in 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
quelle
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.Antworten:
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.
quelle
x.ToString()
dastypeof
s in Release entfernt wird.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:
Meine Problemumgehung: Ich habe diese Methode in mein Testprojekt eingefügt:
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 .
quelle
DbContext
Klasse 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.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.
quelle
Meine Lösung bestand darin, das Entity-Framework über den Nuget-Manager aus dem Projekt zu entfernen und wieder hinzuzufügen.
quelle
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
Ich habe dies gelöst, indem ich ein using-Stament über meine DBContext-Klasse hinzugefügt habe, wie folgt:
quelle
Ich habe die Code-basierte Registrierung für den Anbieter verwendet. link1 link2
Habe gerade die Konfigurationsklasse wie erstellt
Der entscheidende Punkt ist this.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
und benutzte es so
quelle
DbContextConfiguration
? DankeGet-Project MyWinformsProject | Install-Package EntityFramework
der ihn für mich behoben hat. Trotzdem möchte ich den Grund besser verstehen.DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
.Ich habe es mit [DeploymentItem] in meiner Assembly-Initialisierungsklasse aussortiert
quelle
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.
quelle
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.
quelle
Ich habe dies gelöst, indem ich die
EntityFramework.SqlServer.dll
Datei manuell in diebin folder
Hauptanwendung kopiert habe .quelle
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.
quelle
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;
quelle
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.
quelle
Verweisen oder durchsuchen Sie einfach die EF-DLL - EntityFramework.SqlServer.dll
quelle
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.
quelle
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 { }
quelle
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:
quelle
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.
quelle
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 :
Und es hat auch bei mir funktioniert.
quelle
Das Hinzufügen von Entityframework.dll und Entityframework.sqlserver.dll zum Referenzprojekt löste das Problem.
quelle
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.
quelle
Ich hatte auch ein ähnliches Problem
Mein Problem wurde wie folgt gelöst:
quelle
Ich hatte das gleiche Problem mit der Instanziierung eines
DBContext
Objekts 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
quelle
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
quelle
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
quelle
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.
quelle
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.
quelle
Entfernen Sie das Entity-Framework über Nuget aus dem Projekt und fügen Sie es wieder hinzu.
quelle
In meinem Fall
dll
wurde nicht kopiert, obwohl ich einen Verweis darauf hinzugefügt habe. Dies liegt daran, dassEntityFramework.SqlServer.dll
nicht 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.quelle
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.
quelle