web-dev-qa-db-ja.com

Entity Framework 6.1.3が「タイプ 'System.Data.Entity.Infrastructure.TableExistenceChecker'をロードできませんでした」をスローする理由

コンテキストインスタンスが作成されるとすぐに例外がスローされるため、新しいプロジェクトとエンティティフレームワークは開始されません。

エンティティフレームワークは次の例外をスローします。

アセンブリ '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()
39
C Tierney

どうやらGACにエンティティフレームワークへの参照があり、それがNugetを介して参照したものと同じでない場合、このエラーが発生します。私の場合、GACでは6.0.0でした。

解決:

Visual Studioの開発者コマンドプロンプトを起動してから:

gacutil -u EntityFramework
8
C Tierney

EFがGacにインストールされていないことがわかった場合、次のステップは、パッケージのバージョンを書き留めてからアンインストールすることです。 NuGetを使用しているため、ツール...ライブラリパッケージマネージャー...パッケージマネージャーコンソールに移動しました。最初にGUIを試しましたが、アンインストールに失敗しました。この記事の執筆時点では、パッケージの最新バージョンのみをインストールできます。

  1. ソリューションを開き、ツール...ライブラリパッケージマネージャー...パッケージマネージャーコンソールに移動します
  2. EFを使用し、問題が発生しているプロジェクトを選択します
  3. タイプUninstall-package EntityFramework
  4. Visual Studioを再起動するように求められるので、VSとソリューションを閉じて再度開きます。
  5. ツールを使用してパッケージマネージャーコンソールを開く...ライブラリパッケージマネージャー...パッケージマネージャーコンソール
  6. 「Install-package EntityFramework」と入力します(古いバージョンをインストールする場合は、-Version x.x.xを追加します)
  7. あなたは行ってもいいはずです
18
michaelhawkins

ユニットテストプロジェクトでもまったく同じ問題がありました。数時間のトラブルシューティングの後、.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に変更しただけで、すべてのテストが再び正常に実行されました。

私の場合、このエラーが発生したとき、GACでEFを見つけることができませんでした。ですから、何も解き放つことはありませんでした。

しかし、ソリューションのすべてのプロジェクトですべてのEF参照を調査した結果、プロジェクトの1つがEF 6.1.1と他のすべての6.1.3を参照していることがわかりました。この場合、michaelhawkinsの回答が役に立ちました。すべてのプロジェクトからすべてのEFを削除し、同じ最新バージョンをインストールしました。

すべての場合、この例外はおそらくEFのバージョンの競合が原因である可能性が高いため、ここに残してください。ただし、競合を解決するために特に確認する必要があるのは、さまざまな要因に依存する場合があります。

5
Bogdan_Ch

私の場合、このフォルダーからEntityFramework.dllを削除する必要がありました。

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

同じ問題が私に起こった

Visual Studio->ツール->拡張機能と更新プログラムを開きます

  1. Nuget Package Manager Consoleに関連する更新が更新されている場合は、最初に更新を確認してください。

  2. 拡張機能と更新の[すべて]タブを選択し、Nuget Package Managerコンソールのバージョンを確認します

enter image description here

  1. プロジェクトフォルダーを開きます->パッケージ、entityframeworkに関するすべてを削除します

  2. Entityframework.deletemeなどのファイルがある場合->削除してVisual Studioを再起動します

3
Hadnazzar

今後の参考のために、GACからEntityFramework.SqlServerを削除すると、このエラーが修正されました。アセンブリは、アプリケーションで参照されているものとまったく同じバージョンでした(6.0.0.0EntityFramework.dllの両方のEntityFramework.SqlServer.dll)。ただし、この例外が発生したとき、GACにEntityFrameworkがありませんでした。

NuGetを使用して、SQLite Core(x86/x64)でアプリケーションへのEntityFramework参照をインストールしました。また、私は少し前にGACに手を出していましたが、おそらく自分でアセンブリを追加しました。

2
Silvyrfir

ありますか EntityFramework.SqlServer参照?これは、エンティティフレームワークに自動的に付属する必要があります。そうでない場合は、参照として、またはNuget経由で追加してください。

もちろん、あなたがSqlServerプロバイダーを使用している場合です。そうでない場合は、特定のプロバイダーを追加する必要があります。

1
Michal Ciechan

使用しているEFバージョンと一致するようにpackage.configファイルを更新するだけです。この場合、「6.1.3」です。

1
charles

からの接続文字列値の変更

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

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

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" />
0
Paul Shippy