454 Stimmen

Entity Framework Provider Typ konnte nicht geladen werden?

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

System.InvalidOperationException :

Der Entity Framework-Anbieter ' System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer , Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' für die ' System.Data.SqlClient ' ADO.NET-Anbieter konnte nicht geladen werden. Stellen Sie sicher, dass die Anbieter-Assembly für die laufende Anwendung verfügbar ist.

Siehe http://go.microsoft.com/fwlink/?LinkId=260882 f Informationen..

Ich habe keinen Hinweis auf System.Data.Entity in einem meiner Projekte, wie es auf Codeplex für ein Upgrade auf EF6 vorgeschlagen wurde.

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

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

Update

Meine app.config hat die folgende . 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 erhalte 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

448voto

Narcis Punkte 5792

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.

287voto

Robert Muehsig Punkte 5118

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, bekomme ich:

Der Entity Framework-Anbieter-Typ System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' für den 'System.Data.SqlClient' ADO.NET Anbieter konnte nicht geladen werden. Stellen Sie sicher, dass die Anbieter-Assembly für die laufende Anwendung verfügbar ist. [ ] http://go.microsoft.com/fwlink/?LinkId=260882 für weitere Informationen.

Meine Abhilfe: Ich habe diese Methode in meinem Testprojekt platziert:

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 wird nie aufgerufen, aber ich denke, der Compiler entfernt alle "unnötigen" Assemblies und ohne die EntityFramework.SqlServer Sachen schlägt der Test fehl.

Wie auch immer: Funktioniert auf meinem Rechner ;)

Nota: Anstatt die Methode zum Testprojekt hinzuzufügen, können Sie einen statischen Verweis auf SqlProviderServices aus Ihrem Model/Entity-Projekt sicherstellen .

115voto

Timothy Schoonover Punkte 3105

Nuget konfiguriert Ihr EF6-Projekt so, dass es auf EntityFramework.SqlServer.dll verweist. Dies wird während des Builds in den Ausgabeordner für Ihr EF6-Projekt bereitgestellt, aber nicht in den Ausgabeordner für Projekte, die auf Ihr EF6-Projekt verweisen. Ich glaube, das liegt daran, dass Visual Studio "schlau" genug ist, um zu erkennen, dass nichts in Ihrer Assembly die dll direkt verwendet und sie daher nicht einschließt. Sie können erzwingen, dass EntityFramework.SqlServer.dll im Ausgabeordner von Projekten bereitgestellt wird, die auf Ihr EF6-Projekt verweisen (Unit-Tests, UI's usw.), indem Sie Code zu Ihrem EF6-Projekt hinzufügen, der EntityFramework.SqlServer.dll verwendet. Achten Sie darauf, dass Sie den Code nicht in eine generierte Klasse einfügen, da Sie riskieren, ihn bei der nächsten Wiederherstellung zu verlieren. Ich habe mich entschieden, die folgende Klasse zur Assembly 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;
}

45voto

Kevbo Punkte 947

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

36voto

mmttato Punkte 553

Ich löste dies durch Hinzufügen eines using Stament oben auf meine DBContext-Klasse, wie so:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X