452 votes

Le type de fournisseur d'Entity Framework n'a pas pu être chargé ?

J'essaie d'exécuter mes tests sur TeamCity qui est actuellement installé sur ma machine.

System.InvalidOperationException: System.InvalidOperationException :

Le type de fournisseur Entity Framework ' System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer , Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' pour le ' System.Data.SqlClient Le fournisseur ADO.NET n'a pas pu être chargé. Assurez-vous que l'assemblage du fournisseur est disponible pour l'application en cours d'exécution.

Voir http://go.microsoft.com/fwlink/?LinkId=260882 pour plus d'informations

Je n'ai aucune référence à System.Data.Entity dans l'un de mes projets, comme cela a été suggéré sur codeplex pour la mise à niveau vers EF6.

Je ne sais donc pas pourquoi je reçois cette exception. Je n'obtiens aucune exception de ce type lorsque j'exécute les tests depuis VS.

J'ai essayé de mettre CopyLocal à false puis à true mais cela ne semble pas fonctionner non plus.

Mise à jour

Mon app.config est le suivant. Est-ce que cela provoque un comportement que je ne comprends pas ?

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

J'obtiens la trace de pile suivante dans 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

447voto

Zapacila Points 1106

Même problème, mais j'ai installé EF 6 via Nuget. EntityFramework.SqlServer était manquant pour un autre exécutable. J'ai simplement ajouté le paquet nuget à ce projet.

286voto

Robert Muehsig Points 1040

J'ai eu le même problème dans mes projets de test - j'ai installé les derniers bits EF6 via NuGet et chaque fois que j'invoque quelque chose lié à EF, j'obtiens : Le type de fournisseur Entity Framework 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'. pour le fournisseur ADO.NET 'System.Data.SqlClient' n'a pas pu être chargé. Assurez-vous que l'assemblage du fournisseur est disponible pour l'application en cours d'exécution. Voir http://go.microsoft.com/fwlink/?LinkId=260882 pour plus d'informations.

Ma solution de rechange : J'ai placé cette méthode dans mon projet de test :

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

Cette méthode n'a jamais été appelée, mais je pense que le compilateur va supprimer tous les assemblages "inutiles" et sans utiliser le truc EntityFramework.SqlServer le test échoue.

Quoi qu'il en soit : Cela fonctionne sur ma machine ;)

115voto

odysseus.section9 Points 693

Nuget va configurer votre projet EF6 pour qu'il fasse référence à EntityFramework.SqlServer.dll. Cela se déploie dans le dossier de sortie de votre projet EF6 pendant la construction, mais ne déploie pas le dossier de sortie pour les projets faisant référence à votre projet EF6. Je pense que c'est parce que Visual Studio est assez "intelligent" pour détecter que rien dans votre assembly n'utilise directement la dll et ne l'inclut donc pas. Vous pouvez forcer EntityFramework.SqlServer.dll à être déployé dans le dossier de sortie des projets référençant votre projet EF6 (tests unitaires, interfaces utilisateur, etc.) en ajoutant du code à votre projet EF6 qui utilise EntityFramework.SqlServer.dll. Attention à ne pas mettre le code dans une classe générée car vous risquez de le perdre lors du prochain regen. J'ai choisi d'ajouter la classe suivante à l'assembly, ce qui a réglé le problème.

internal static class MissingDllHack
{
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

20voto

Nash Points 51

J'ai utilisé l'enregistrement basé sur le code pour le fournisseur. lien1 lien2

J'ai créé la classe de configuration comme suit

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

Le point clé est this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance) ;

et l'a utilisé de la manière suivante

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

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

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

15voto

Random Points 569

Je l'ai résolu avec [DeploymentItem] sur mon assemblage initialisant la classe

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X