为什么实体框架6.1.3抛出了一个"无法加载类型' System.Data.Entity.Infrastructure.TableExistenceChecker'"

时间:2015-03-14 17:25:54

标签: c# .net entity-framework entity-framework-6

由于在创建上下文实例后抛出异常,全新的项目和实体框架将无法启动。

实体框架抛出以下异常:

  

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

参考文献:

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

13 个答案:

答案 0 :(得分:17)

如果您发现我没有在Gac中安装EF,那么下一步就是在您记下包的版本后卸载它。我使用NuGet,所以我去了Tools ... Library Package Manager ... Package Manager Console。我首先尝试了GUI,但卸载失败,在撰写本文时,您只能安装最新版本的软件包。

  1. 打开解决方案并转到工具...库包管理器...包管理器控制台
  2. 选择使用EF并遇到问题的项目
  3. 键入Uninstall-package EntityFramework
  4. 系统应提示您重新启动Visual Studio,然后重新打开VS和解决方案
  5. 使用工具打开包管理器控制台...库包管理器...包管理器控制台
  6. 键入Install-package EntityFramework(如果要安装旧版本,请添加-Version x.x.x)
  7. 你应该好好去

答案 1 :(得分:9)

我的单元测试项目中遇到了完全相同的问题。经过几个小时的故障排除后,我注意到.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,所有测试再次运行正常。

答案 2 :(得分:8)

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

解决方案:

启动visual studio的开发人员命令提示符:

gacutil -u EntityFramework

答案 3 :(得分:5)

就我而言,当我收到此错误时,我无法在GAC中找到EF。所以没有什么是unistall。

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

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

答案 4 :(得分:3)

在我的情况下,我不得不从这个文件夹中删除EntityFramework.dll:

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

答案 5 :(得分:3)

同样的问题发生在我身上

打开Visual Studio - &gt;工具 - &gt;扩展和更新

  1. 如果与Nuget Package Manager控制台相关的任何更新更新,则首先检查更新。

  2. 在“扩展和更新”中选择“全部”选项卡,确保您的Nuget包管理器控制台版本

  3. enter image description here

    1. 打开您的项目文件夹 - &gt;然后包删除有关entityframework的所有内容

    2. 如果有像entityframework.deleteme这样的文件 - &gt;删除它并重新启动Visual Studio

答案 6 :(得分:2)

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

我使用NuGet使用SQLite Core(x86 / x64)为我的应用程序安装了EntityFramework引用。此外,我之前曾涉足GAC,并且很可能自己也在那里添加了组件。

答案 7 :(得分:1)

你引用了EntityFramework.SqlServer吗?这应该是实体框架自动生成的。如果不是,请尝试将其添加为参考,或通过Nuget。

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

答案 8 :(得分:1)

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

答案 9 :(得分:0)

在运行使用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" />

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

EntityFramework\Add-Migration

代替

Add-Migration