为啥实体框架 6.1.3 抛出“无法加载类型‘System.Data.Entity.Infrastructure.TableExistenceChecker’”

Posted

技术标签:

【中文标题】为啥实体框架 6.1.3 抛出“无法加载类型‘System.Data.Entity.Infrastructure.TableExistenceChecker’”【英文标题】:Why is Entity Framework 6.1.3 throwing a "Could not load type 'System.Data.Entity.Infrastructure.TableExistenceChecker'"为什么实体框架 6.1.3 抛出“无法加载类型‘System.Data.Entity.Infrastructure.TableExistenceChecker’” 【发布时间】:2015-05-17 02:20:56 【问题描述】:

全新的项目和实体框架将不会启动,因为一旦创建上下文实例就会引发异常。

实体框架抛出以下异常:

无法从程序集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.Data.Entity.Infrastructure.TableExistenceChecker”。

参考资料:

实体框架 EntityFramework.SqlServer

通过 nuget 包管理器:

Install-Package entityframework

非常简单的上下文和实体:

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

这是当前的 app.config 文件:

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

堆栈跟踪如下:

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

【问题讨论】:

我在更改连接字符串时遇到了类似的问题。也许通过替换 %DatabaseName% 来尝试这个: 此问题没有标记解决方案。你解决了吗?怎么解决的?很好奇,因为我现在遇到了同样的问题:/ 【参考方案1】:

如果您像我一样发现 EF 没有安装在 Gac 中,那么下一步就是在您记下软件包的版本后将其卸载。我使用 NuGet,所以我去了工具...库包管理器...包管理器控制台。我首先尝试了 GUI,但卸载失败,在撰写本文时,您只能安装最新版本的软件包。

    打开您的解决方案并转到工具...库包管理器...包管理器控制台 选择使用 EF 且有问题的项目 键入 Uninstall-package EntityFramework 应该提示您重新启动 Visual Studio 如此关闭并重新打开 VS 和您的解决方案 使用工具打开包管理器控制台...库包管理器...包管理器控制台 键入 Install-package EntityFramework(如果要安装旧版本,请添加 -Version x.x.x) 你应该很高兴

【讨论】:

我认为update-package EntityFramework 也一样,而且更容易,对我来说它会自动卸载旧版本然后安装新版本,这很好。 如果您选择上面的 update-package 解决方案,请注意,您可以像我一样,最终在所有相关项目中更新 EF。变成了我的噩梦【参考方案2】:

我在单元测试项目中遇到了完全相同的问题。经过几个小时的故障排除后,我注意到 .csproj 文件仍然引用了我以前版本的 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>

我只是将版本更改为 6.1.3,然后所有测试再次运行良好。

【讨论】:

【参考方案3】:

显然,如果 GAC 中有对实体框架的引用,并且它与您通过 Nuget 引用的不同,则会出现此错误。就我而言,它在 GAC 中是 6.0.0。

解决办法:

然后启动 Visual Studio 的开发人员命令提示符:

gacutil -u EntityFramework

【讨论】:

'gacutil' 不是内部或外部命令、可运行程序或批处理文件。 docs.microsoft.com/en-us/dotnet/framework/tools/…【参考方案4】:

在我遇到此错误时,我无法在 GAC 中找到 EF。所以没有什么可以卸载的。

但是,在调查了解决方案的所有项目中的所有 EF 引用后,发现其中一个项目引用了 EF 6.1.1,而所有其他项目引用了 6.1.3。 michaelhawkins 的回答在这种情况下有所帮助,我从所有项目中删除了所有 EF,然后重新安装了相同的最新版本。

将其留在这里,因为在所有情况下,此异常很可能是由于 EF 版本的冲突造成的,但您具体需要在哪里解决冲突可能取决于各种因素。

【讨论】:

【参考方案5】:

在我的情况下,我必须从该文件夹中删除 EntityFramework.dll:

C:\Windows\Microsoft.NET\assembly\GAC_MSIL\EntityFramework

【讨论】:

@Kjartan 可以解释否决票的原因吗?对我来说,找到正确的参考并不那么迫切。我以为 VS 只会从我的包文件夹中获取 dll。 这适用于类似的问题。在我的情况下,我无法进行 edmx 更新(将表添加到模型)。它会失败并出现所有类似的错误(我安装了实体框架工具 6.1.1)。我按照这个答案所说的方式删除了它。顺便说一句,我所有的队友都没有遇到同样的问题,他们的机器上没有 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\EntityFramework 文件夹【参考方案6】:

同样的问题发生在我身上

打开 Visual Studio --> 工具 --> 扩展和更新

    如果有任何与 Nuget 包管理器控制台相关的更新更新它,请先检查更新。

    在扩展和更新中选择所有选项卡,确保您的 Nuget 包管理器控制台版本

    打开你的项目文件夹 --> Packages 然后删除关于 entityframework 的所有内容

    如果有 entityframework.deleteme 之类的文件 --> 删除后重启 Visual Studio

【讨论】:

【参考方案7】:

在我的案例中,从 GAC 中删除 EntityFramework.SqlServer 以供将来参考,修复了此错误。该程序集与我的应用程序中引用的版本完全相同(6.0.0.0 用于EntityFramework.dllEntityFramework.SqlServer.dll)。但是,发生此异常时,我在 GAC 中没有 EntityFramework

我已经使用 NuGet 安装了对我的应用程序的 EntityFramework 引用和 SQLite Core (x86/x64)。此外,我之前也曾涉足过 GAC,而且很可能我自己在那里添加了程序集。

【讨论】:

【参考方案8】:

您是否引用了EntityFramework.SqlServer?这应该随实体框架自动出现。如果没有,请尝试将其添加为参考,或通过 Nuget。

当然,如果你是使用 SqlServer 提供者的话。如果没有,您需要添加您的特定提供商。

【讨论】:

在您作为 Startup 的项目中? 是的,所有一个项目。非常简单的测试项目。 我会说卸载 EF,然后重新安装。如果这不起作用,请卸载并安装早期版本 也试过了,只是在版本 6 和 6.1 的同一位置抛出了不同的异常 最奇怪的是我有一个设计优先的模型,同样的机器工作得很好。但是代码优先我什至无法运行单个项目【参考方案9】:

只需更新 package.config 文件以匹配您使用的 EF 版本 在这种情况下,它是“6.1.3”。

【讨论】:

【参考方案10】:

另一个简单的绕过是使用:

EntityFramework\Add-Migration

改为

Add-Migration

【讨论】:

【参考方案11】:

在运行使用 SQL CE 的单元测试时,我在安装 Visual Studio 2015 (VS 2015) 后遇到了同样的错误。我的连接工厂是SqlCeConnectionFactory,提供者是System.Data.Entity.SqlServerCompact.SqlCeProviderServicesEntityFramework.SqlServerCompact

我的解决方案是将EntityFramework.SqlServerCompact.dll 的路径添加到我的.testsettings 文件中的部署列表中。我添加的行如下所示:

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

【讨论】:

【参考方案12】:

更改连接字符串值
"data source=.;initial catalog=[dbname];integrated security=True"

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

【讨论】:

【参考方案13】:

在我的情况下,当我在两个不同版本的 EF 之间切换时,我在两个不同的项目中工作。重新启动 VS2017 解决了这个问题。

【讨论】:

以上是关于为啥实体框架 6.1.3 抛出“无法加载类型‘System.Data.Entity.Infrastructure.TableExistenceChecker’”的主要内容,如果未能解决你的问题,请参考以下文章

实体框架核心错误? SaveChanges 抛出选择

无法生成显式迁移 - 具有多个上下文/配置的实体框架 6.1.3

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

实体框架在使用 Find 方法时抛出异常

为啥以下查询不适用于双 LIKE 子句?

当有任何 SOAP 请求的挂起的实体框架数据库迁移时抛出 SOAP 异常