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:
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()
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
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.
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.
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.
Dans mon cas, j'ai dû supprimer EntityFramework.dll de ce dossier:
C:\Windows\Microsoft.NET\Assembly\GAC_MSIL\EntityFramework
Le même problème m'est arrivé
Ouvrez Visual Studio -> Outils -> Extensions et mises à jour
Vérifiez d'abord les mises à jour si une mise à jour liée à la console Nuget Package Manager la met à jour.
Sélectionnez Tout dans les extensions et les mises à jour, assurez-vous que la version de votre console Nuget Package Manager Console
Ouvrez votre dossier de projet -> Packages puis supprimez tout ce qui concerne entityframework
S'il existe un fichier comme entityframework.deleteme -> le supprimer et redémarrer Visual Studio
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.
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".
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.
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"
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" />