web-dev-qa-db-fra.com

Pourquoi Entity Framework 6.1.3 génère-t-il un "Impossible de charger le type 'System.Data.Entity.Infrastructure.TableExistenceChecker'"

Le tout nouveau projet et structure d'entité ne démarrera pas car l'exception est déclenchée dès que l'instance de contexte est créée. 

Entity Framework lève l'exception suivante:

Impossible de charger le type 'System.Data.Entity.Infrastructure.TableExistenceChecker' depuis Assembly 'EntityFramework, Version = 6.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089'.

Références:

  • Cadre d'entité 
  • EntityFramework.SqLServer

Via le gestionnaire de paquets Nuget:

Install-Package entityframework

Contexte et entité très simple:

public class TextDbContext : DbContext
{
    public TextDbContext()
        : base("Test")
    {
    }

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

public class TestEntity
{
    public int Id { get; set; } 
    public string Name { get; set; }
}

static void Main(string[] args)
{
    var test = ConfigurationManager.ConnectionStrings["Test"].ConnectionString;

    using (var conn = new SqlConnection(test))
    {
        conn.Open();
        var cmd = new SqlCommand("Select * from testtable", conn);
        var result = cmd.ExecuteReader();
    }
    //exception thrown on this line is the same as the one in the context
    var instance = SqlProviderServices.Instance;

    using (var db = new TextDbContext())
    {
         var item = new TestEntity
         {
             Name = "xyz"
         };
         db.TestEntity.Add(item);
         db.SaveChanges();
    }
}

Voici le fichier app.config actuel:

<?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" />
    </configSections>
    <connectionStrings>
        <add name="Test" connectionString="server=localhost;database=Test;Data Source=localhost;Integrated Security=True;Pooling=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup>
       <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
         <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
</configuration>

La trace de pile est la suivante:

   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
   at System.Data.Entity.Utilities.MemberInfoExtensions.GetValue(MemberInfo memberInfo)
   at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(Type providerType)
   at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName)
   at System.Data.Entity.Internal.AppConfig.<.ctor>b__2(ProviderElement e)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at System.Data.Entity.Internal.AppConfig.<.ctor>b__1()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at System.Lazy`1.get_Value()
   at System.Data.Entity.Internal.AppConfig.get_DbProviderServices()
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.RegisterDbProviderServices()
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.GetServiceFactory(Type type, String name)
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 t)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Infrastructure.DependencyResolution.DbDependencyResolverExtensions.GetServiceAsServices(IDbDependencyResolver resolver, Type type, Object key)
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.GetServices(Type type, Object key)
   at System.Data.Entity.Infrastructure.DependencyResolution.ResolverChain.<>c__DisplayClass6.<GetServices>b__5(IDbDependencyResolver r)
   at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Linq.Enumerable.<OfTypeIterator>d__aa`1.MoveNext()
   at System.Data.Entity.Utilities.IEnumerableExtensions.Each[T](IEnumerable`1 ts, Action`1 action)
   at System.Data.Entity.Infrastructure.DependencyResolution.InternalConfiguration.Lock()
   at System.Data.Entity.Infrastructure.DependencyResolution.DbConfigurationManager.<.ctor>b__1()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at System.Lazy`1.get_Value()
   at System.Data.Entity.Infrastructure.DependencyResolution.DbConfigurationManager.GetConfiguration()
   at System.Data.Entity.DbContext.InitializeLazyInternalContext(IInternalConnection internalConnection, DbCompiledModel model)
   at System.Data.Entity.DbContext..ctor(String nameOrConnectionString)
   at test2.TextDbContext..ctor() in \\srv\users\carl.tierney\Documents\Visual Studio 2013\Projects\test2\test2\test2context.cs:line 13
   at test2.Program.Main(String[] args) in \\srv\users\carl.tierney\Documents\Visual Studio 2013\Projects\test2\test2\Program.cs:line 13
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly Assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state
   at System.Threading.ThreadHelper.ThreadStart()
38
C Tierney

Apparemment, s'il y a une référence à la structure d'entité dans le GAC et que ce n'est pas la même chose que celle que vous avez référencée via Nuget, vous obtenez cette erreur. Dans mon cas, c'était 6.0.0 dans le GAC. 

Solution: 

Lancez la commande de développeur Prompt pour visual studio puis:

gacutil -u EntityFramework
8
C Tierney

Si vous constatez que je n'ai pas installé EF dans le Gac, l'étape suivante consiste à le désinstaller APRÈS la version de votre paquet. J'utilise NuGet alors je suis allé à Outils ... Gestionnaire de paquets de bibliothèque ... Console du gestionnaire de paquets. J'ai d'abord essayé l'interface graphique, mais la désinstallation a échoué et à ce jour, vous ne pouvez installer que la dernière version du paquet.

  1. Ouvrez votre solution et allez dans Outils ... Gestionnaire de packages de bibliothèque ... Console du gestionnaire de packages
  2. Sélectionnez le projet qui utilise EF et a le problème
  3. Type Uninstall-package EntityFramework
  4. Vous devez être invité à redémarrer Visual Studio afin de fermer et de rouvrir VS et votre solution.
  5. Ouvrez la console du gestionnaire de packages avec Outils ... Gestionnaire de packages de bibliothèque ... Console de gestionnaire de packages
  6. Tapez Install-package EntityFramework (ajoutez -Version x.x.x si vous installez une version plus ancienne)
  7. Vous devriez être bon pour aller
17
michaelhawkins

J'ai eu exactement le même problème dans mon projet de test unitaire. Après quelques heures de dépannage, j'ai remarqué que le fichier .csproj faisait toujours référence à ma version précédente de EF:

<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.dll</HintPath>
</Reference>

J'ai simplement changé la version 6.1.3 et tous les tests se sont bien déroulés.

9

Dans mon cas, lorsque j'ai eu cette erreur, je n'ai pas pu trouver EF dans GAC. Donc, rien ne devait être unistall.

Toutefois, après avoir examiné toutes les références EF dans tous les projets de la solution, il s’est avéré que l’un des projets faisait référence à EF 6.1.1 et à tous les autres 6.1.3. Réponse de michaelhawkins a aidé dans ce cas, j'ai supprimé tous les EF de tous les projets et ensuite installé la même version la plus récente. 

Laissez-le simplement ici, car dans tous les cas, cette exception est très probablement due à un conflit de versions de EF, mais le cas particulier où vous devez chercher à résoudre le conflit peut dépendre de divers facteurs.

5
Bogdan_Ch

Dans mon cas, j'ai dû supprimer EntityFramework.dll de ce dossier:

C:\Windows\Microsoft.NET\Assembly\GAC_MSIL\EntityFramework
3
mguadarrama

Le même problème m'est arrivé 

Ouvrez Visual Studio -> Outils -> Extensions et mises à jour 

  1. Vérifiez d'abord les mises à jour si une mise à jour liée à la console Nuget Package Manager la met à jour. 

  2. Sélectionnez Tout dans les extensions et les mises à jour, assurez-vous que la version de votre console Nuget Package Manager Console 

 enter image description here

  1. Ouvrez votre dossier de projet -> Packages puis supprimez tout ce qui concerne entityframework 

  2. S'il existe un fichier comme entityframework.deleteme -> le supprimer et redémarrer Visual Studio 

3
Hadnazzar

Avez-vous EntityFramework.SqlServer référencé? Cela devrait venir automatiquement avec le cadre de l'entité. Sinon, ajoutez-le comme référence ou via Nuget.

Bien sûr, c’est-à-dire si vous utilisez le fournisseur SqlServer. sinon, vous devez ajouter votre fournisseur spécifique.

1
Michal Ciechan

Il suffit de mettre à jour le fichier package.config pour qu'il corresponde à la version EF que vous utilisez Dans ce cas, il s'agit de "6.1.3".

1
charles

Pour référence future dans mon cas, la suppression de EntityFramework.SqlServer de GAC a corrigé cette erreur. L'Assemblée était exactement la même version que celle référencée dans mon application (6.0.0.0 pour EntityFramework.dll et EntityFramework.SqlServer.dll). Cependant, je n'avais pas EntityFramework dans GAC lorsque cette exception s'est produite.

J'avais installé les références EntityFramework à mon application avec SQLite Core (x86/x64) à l'aide de NuGet. De plus, j'avais déjà eu l'occasion de discuter avec GAC un peu plus tôt et j'ai probablement ajouté l'Assemblée moi-même.

1
Silvyrfir

Modification de la valeur de la chaîne de connexion de 

"data source=.;initial catalog=[dbname];integrated security=True"

À

"Server=.;Database=[dbname];integrated security=True"
0
Houssam Hamdan

Je recevais cette même erreur après l'installation de Visual Studio 2015 (VS 2015) lors de l'exécution de tests unitaires utilisant SQL CE. Ma fabrique de connexions est SqlCeConnectionFactory et le fournisseur est System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact.

La solution pour moi consistait à ajouter le chemin d'accès à EntityFramework.SqlServerCompact.dll à la liste de déploiement dans mon fichier .testsettings. La ligne que j'ai ajoutée ressemble à ceci:

<DeploymentItem filename="packages\EntityFramework.SqlServerCompact.6.1.1\lib\net45\EntityFramework.SqlServerCompact.dll" />
0
Paul Shippy