web-dev-qa-db-fra.com

Le type de fournisseur 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

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'assembly du fournisseur est disponible pour l'application en cours d'exécution. 

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

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

Donc, je ne suis pas sûr de savoir pourquoi je reçois cette exception . Je ne reçois pas une telle exception lorsque je lance les tests à partir de VS.

J'ai essayé de définir CopyLocal sur false, puis à nouveau sur true .. mais cela ne semble pas fonctionner non plus.

Mettre à jour 

Mon app.config a le suivant. Est-ce que cela cause 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>

Je reçois le stacktrace suivant 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
383
ashutosh raina

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 de pépites à ce projet.

393
Zapacila

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'appelle quelque chose lié à EF, j'ai:

Le type de fournisseur Entity Framework 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer 'pour le' System.Data.SqlClient 'ADO.NET fournisseur n'a pas pu être chargé. Assurez-vous que l'assembly 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 contournement: 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 supprimera tous les assemblages "inutiles" et sans l’utilisation du traitement EntityFramework.SqlServer, le test échoue. 

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

Remarque: Au lieu d'ajouter la méthode pour tester le projet, vous pouvez assurer une référence statique à SqlProviderServices à partir de votre modèle/projet d'entité .

259
Robert Muehsig

Nuget configurera votre projet EF6 pour faire référence à EntityFramework.SqlServer.dll. Cela se déploie dans le dossier de sortie de votre projet EF6 pendant la construction, mais ne se déploiera pas dans le dossier de sortie pour les projets faisant référence à votre projet EF6. Je pense que cela est dû au fait que Visual Studio est suffisamment "intelligent" pour détecter que rien dans votre assembly n'utilise réellement la dll directement 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 utilisant EntityFramework.SqlServer.dll. Veillez à ne pas placer le code dans une classe générée car vous risqueriez de le perdre lors de la prochaine régénération. J'ai choisi d'ajouter la classe suivante à l'assembly, ce qui corrigeait le problème.

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
Timothy Schoonover

Ma solution consistait à supprimer le cadre d'entité du projet via le gestionnaire de pépites et à le réintégrer.

40
Kevbo

J'ai résolu ce problème en ajoutant une instruction using au-dessus de ma classe DBContext, comme ceci:

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

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

Vient de créer la classe de configuration comme

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 utilisé de la sorte

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

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

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

Je l'ai réglé avec [DeploymentItem] sur ma classe d'initialisation d'assembly

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

En retard à la fête, mais les réponses les plus votées me semblaient être des bidouilles.

Tout ce que j'ai fait est de supprimer les éléments suivants de mon app.config dans le projet de test. Travaillé.

  <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

J'ai un problème, parce que je n'ajoute pas de référence à EntityFramework.sqlServer.dll . Lorsque je développe un programme, cela fonctionne. Mais lorsque je publie et installe une application, une erreur est générée.

Je viens d'ajouter référence et construire et publier à nouveau.

References

7
Matej

Je vois un problème similaire, et en utilisant la méthode de ce post: ( http://entityframework.codeplex.com/workitem/1590 ), qui résout mon problème. 

Pour contourner le problème, vous pouvez faire en sorte que votre test assigne directement l'assembly du fournisseur en ajoutant une ligne comme ceci n'importe où dans l'assembly de test: Var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

4
Innovation Wang

J'ai finalement résolu ceci. Il s'avère que j'ai eu une implémentation erronée d'IDsposable dans ma classe de référentiel. J'ai corrigé ça. L'implémentation erronée a provoqué une exception stackoverflow car je ne disposais pas correctement des ressources. Ceci a empêché VS d’exécuter les tests et le moteur d’exécution du test s’est écrasé. 

Je l'ai déposée ici avec Microsoft (c'était avant d'avoir la bonne solution) .

Quoi qu'il en soit, les builds fonctionnent maintenant bien sur teamcity. Bien que je sois toujours curieux de savoir pourquoi ni le moteur d’exécution de VS Test n’avait un moyen gracieux de me dire ce qui se passait, à part Team City.

J'ai découvert la cause en déboguant manuellement le test (ce que je ne réalisais qu'après plusieurs jours, le correctif m'a pris 5 secondes).

Espérons que cela aidera quelqu'un qui rencontre de tels problèmes.

4
ashutosh raina

J'ai résolu ce problème en copiant manuellement le fichier EntityFramework.SqlServer.dll dans le bin folder de l'application principale.

4
Sreeja Sj

Il suffit de référencer ou de naviguer dans la dll EF - EntityFramework.SqlServer.dll

3
yogihosting

Lorsque j'ai inspecté le problème, j'ai remarqué que les dll suivantes étaient manquantes dans le dossier de sortie. La solution simple consiste à copier Entityframework.dll et Entityframework.sqlserver.dll avec le fichier app.config dans le dossier de sortie si l'application est en mode débogage. En même temps, le paramètre de l'option de construction "Copier dans le dossier de sortie" de app.config est toujours copié. Cela résoudra votre problème.

3

J'ai eu le même problème que j'ai essayé à plusieurs reprises, mais il n'a pas été résolu, mais lorsque j'ai installé le package EntityFramework.SqlServerCompact, il a résolu d'installer ce package à partir du gestionnaire de packages Nuget.

Install-Package EntityFramework.SqlServerCompact
3
Alishan

Cela ne se produit que dans mes projets de test de charge/unité. Frustrant, je l’avais fait apparaître dans un projet que je menais depuis 2 ans. Doit avoir été un ordre de test en cours qui brise les choses. Je suppose qu'une fois que fi est enlevé son parti. 

J'ai trouvé que le simple fait de déclarer une variable qui utilise la valeur correcte corrige le problème ... Je n'ai même jamais appelé la méthode. Juste le définir. Bizarre mais ça marche.

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

Je ne voulais pas faire référence à EF dans mon projet d'application (ni copier manuellement quoi que ce soit), alors j'ai ajouté cela aux événements post-génération de mon projet EF:

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

J'ai vérifié la fenêtre de sortie de débogage dans le projet de test unitaire. EntityFramework.SqlServer.dll n'a pas été chargé. Après l'ajout au dossier bin, les tests ont été exécutés avec succès.

1
yW0K5o

L'ajout d'Entityframework.dll et d'Entityframework.sqlserver.dll au projet de référence a résolu le problème.

1
Nish

J'ai aussi eu un problème similaire

Mon problème a été résolu en procédant comme suit:

 enter image description here

 enter image description here

1
BehrouzMoslem

Après avoir essayé toutes les autres solutions suggérées et que mon projet ne fonctionne pas, j'ai finalement trouvé un petit commentaire dans cette page :

La suppression du dossier BIN l'a fait pour moi

Et cela a fonctionné pour moi aussi. 

Maintenant, je ne peux pas dire si vous devez simplement supprimer le dossier bin et tout fonctionnera déjà ou si vous devez d’abord faire ce que les autres développeurs ont suggéré, mais le fait est que je ne l’ai fait que fonctionner après la suppression du fichier. dossier bin, et cela après 3 heures ou plus à la recherche et d’essayer d’autres solutions. Alors, peut-être que cela fonctionnera pour vous aussi.

1
Ulysses Alves

Dans mon cas, j'ai résolu le problème en installant SQL Server 2012 Developer Edition alors que j'avais déjà installé SQL Server Express 2012 (x64). Il semble que cela m'a fourni la dépendance manquante.

0
Farrukh Najmi

Il y a une solution facile. ouvrez les références dans votre projet, cliquez avec le bouton droit de la souris sur "System.Data" -> Propriétés. Changez "Copie locale" en "Vrai". 

Le problème devrait être corrigé.

0
ChinaHelloWorld

Cliquez sur Référence> vérifiez que la référence EntityFramework est présente ou non  

Si non disponible Ajoutez-le 

Cliquer sur 

Ajouter une référence> Ajouter un cadre d'entité 1) EntityFrameWork 2) EntityFrameWork.SqlServer

0
Siddhartha

En plus de toutes les suggestions utiles présentées ici, si vous utilisez EF 6.1.3, assurez-vous que la version .net de votre projet est 4.5 ou plus.

0
Mauricio Atanache

J'ai eu le même problème avec Instantiated DBContext object d'un projet de test unitaire. J'ai vérifié mes packages de projet de test unitaire et je me suis dit que le package EntityFramework n'était pas installé, que j'ai installé celui de Nuget et que le problème a été résolu (je pense qu'il s'agit d'un bug EF).

bonne codage 

0
Code_Worm

Assurez-vous qu'EntityFramework.dll, EntityFramework.SqlServer.dll et la DLL de votre fournisseur (pour SQL Server Compact, qui EntityFramework.SqlServerCompact.dll) se trouvent dans le dossier de l'application déployée. Ceci est particulièrement important pour les applications déployées.

0
falopsy

Dans mon cas, dll n'a pas été copié bien que j'y ai ajouté une référence. En effet, EntityFramework.SqlServer.dll n'est pas copié dans votre projet. Ajoutez cette dll et cela fonctionnera, espérons-le. Vous pouvez le trouver dans le projet où vous avez ajouté datamodel.

0
Baqer Naqvi

J'ai rencontré exactement le même problème sur mon serveur de génération de CI (sous Bamboo), qui n'installe aucun Visual Studio IDE dessus.

Sans modifier le code pour le processus de construction/test (ce qui, à mon avis, n'est pas une bonne solution), le meilleur moyen est de copier le EntityFramework.SqlServer.dll et de le coller dans C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE. (où votre plus courant en cours d'exécution)

Problème résolu!

0
Kelvin

Je viens d'avoir le même message d'erreur.

J'ai un projet séparé pour mon accès aux données. L'exécution du projet Web (qui a référencé le projet de données) localement a parfaitement fonctionné. Mais lorsque j'ai déployé le projet Web sur Azure, Assembly: EntityFramework.SqlServer n'était pas copié. Je viens d'ajouter la référence au projet Web et de le redéployer, maintenant cela fonctionne. 

espérons que cela aide les autres

0
pastrami01

supprimez le framework d’entités du projet via nuget puis rajoutez-le dans.

0
Griffo

Le problème dans mon cas était que, pour attraper une autre exception, j'avais activé les exceptions CLR (Common Language Runtime). Et j'ai oublié de le désactiver.

Je l'ai désactivé dans mon paramètre d'exception. et il a négligé cette exception et a ensuite couru et créé automatiquement une base de données (dans mon cas).

0
Blue Clouds

Je travaillais hors ligne sur le didacticiel de l'Université Contoso et je rencontrais le même problème lorsque je tentais de créer mon premier contrôleur à l'aide de EF . Je devais utiliser la console Package Manager pour charger EF à partir du cache de nuget et créer une chaîne de connexion vers mon serveur local. instance de SQL Server, mon paramètre ici est mon paramètre webConfig pour EF peut ne pas être défini comme vous tous là-bas, mais j'ai pu résoudre mon problème en supprimant complètement la section "fournisseurs" dans "entityFramework"

Robert

0
Robert K