web-dev-qa-db-ja.com

エラー:不変名「System.Data.SqlClient」を持つADO.NETプロバイダーのEntity Frameworkプロバイダーが見つかりません

私は最近、古いプロジェクトのEntity Frameworkをバージョン4または5からバージョン6にアップグレード/更新しました。この例外が発生しました。

EntityFramework.dllでタイプ 'System.InvalidOperationException'の例外が発生しましたが、ユーザーコードでは処理されませんでした

追加情報:不変名「System.Data.SqlClient」を持つADO.NETプロバイダーのEntity Frameworkプロバイダーが見つかりません。プロバイダーがアプリケーション構成ファイルの「entityFramework」セクションに登録されていることを確認してください。詳細については、 http://go.Microsoft.com/fwlink/?LinkId=260882 を参照してください。

私はエラーをグーグルで検索し、いくつかのSOスレッドに遭遇しましたが、それらのどれも私に役立つソリューションを含んでいませんでした。これは私のApp.configがどのように見えるかです:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <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>

私はすでにプロジェクトからEntity Frameworkをアンインストールして再インストールし、古いEFファイルへのすべての参照を削除して再インストールしましたが、何も機能しません。このエラーが引き続き発生します。

43
Leon Cullens

わかりました、これはかなり奇妙です。いくつかのプロジェクトがあります。1つはUIプロジェクト(ASP.NET MVCプロジェクト)であり、その他はリポジトリなどのプロジェクトです。リポジトリプロジェクトにはEFへの参照がありましたが、UIプロジェクトにはありませんでした(1つは必要なかったため、他のプロジェクトを参照する必要がありました)。 UIプロジェクトにもEFをインストールした後、すべてが機能し始めました。これが、このコードをWeb.configに追加した理由です。

<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>
34
Leon Cullens

EntityFrameworkと.SqlServerアセンブリの両方への参照を持つモデルプロジェクトと、ASP.NET MVCを使用する別のUIプロジェクトがある状況で、この問題が発生しました。 EF 4.1から6.1にアップグレードしたかった。私は実際にここで説明したことの一部partをしなければなりませんでした: http://robsneuron.blogspot.com/2013/11/entity- framework-upgrade-to-6.html 。 UIプロジェクトにこれらのプロジェクトへの参照を追加せず、UIプロジェクトのweb.configに構成を追加しなかったことを強調したいと思います。これらの手順は懸念の分離に違反するためです。

私がやったことはモデルプロジェクトで、EntityFramework.SqlServerの「ローカルコピー」参照設定(および安全のためにEntityFramework参照)を「False」に反転し、すべてを保存してプロジェクトを取得する必要がありました<Private>ノードを.csprojファイルに追加し、それを「True」に戻し、再度保存して、Trueが最終値になるようにします。

また、ラインが何もしない場合でも、アセンブリの使用を強制するために、そのコンストラクターのDbContext派生クラスにハック行を追加する必要がありました。これらの手順は両方とも、ブログ投稿から学びました。

public MyContext : DbContext
{
    public MyContext() : base("name=MyContext")
    {
        // the terrible hack
        var ensureDLLIsCopied = 
                System.Data.Entity.SqlServer.SqlProviderServices.Instance;   
    }

私がこの恐ろしいバグを乗り越える手助けをしてくれたので、私が参照したそのブログの作者、そしてSOで質問をして回答したすべての人々に感謝したいと思います。

47
bcr

私は同じ問題を抱えていますが、違いはソースコードにアクセスできないことです。 EntityFramework.SqlServer.dllの正しいバージョンをアプリケーションのbinディレクトリに配置することで問題を修正しました。

15
hendryanw

解決しました。ソリューションにEntity Frameworkを再度インストールする必要があります。いずれかのアプローチに従ってください。

最初 =ソリューションまたはプロジェクトのルートを右クリックし、Manage NuGet Packagesをクリックします。 「EntityFramework」を選択し、適切なプロジェクトを選択して「OK」をクリックします。

または

Second =コンソールパッケージマネージャーに移動して、Install-Package EntityFrameworkを実行します。

それが役に立てば幸い。

12
Sandy

Hendryの答えは100%正しいです。 EF dbコンテキスト操作をカプセル化するメソッドを使用してデータベースを処理するリポジトリプロジェクトがあるアプリケーションでも、同じ問題が発生しました。他のプロジェクトではこのリポジトリを使用していますが、これらのプロジェクトでEFを参照したくありません。どういうわけか、私はそれが適切だとは思わず、リポジトリプロジェクトでのみEFを必要とします。とにかく、EntityFramework.SqlServer.dllを他のプロジェクト出力ディレクトリにコピーすることで問題は解決します。問題を回避するために、このdllのコピーを忘れた場合、リポジトリビルドディレクトリを変更できます。リポジトリプロジェクトのプロパティに移動し、[ビルド]タブを選択します。出力セクションでは、出力ディレクトリを他のプロジェクトのビルドディレクトリに設定できます。もちろん、それは単なる回避策です。あるプラセックで言及されているハックの方が良いかもしれません:

var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

それでも、開発目的にはそれで十分です。後で、インストールまたは公開を準備するときに、このファイルをパッケージに追加できます。

私はEFが初めてです。この問題を解決するより良い方法はありますか?私は「ハック」が好きではありません-「安全ではない」何かがあると感じさせます。

6
Mikk

DBContextで以下のコードを使用して問題を解決しました

 
 public部分クラスQ4Sandbox:DbContext 
 {
 public Q4Sandbox()
:base( "name = Q4Sandbox")
 {
} 
 
 public virtual DbSet Employees {get;セットする; } 
 
 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
 var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance; 
 } 
} 

SOメンバーに感謝します。

5
Aji

私にとってうまくいったのは、EF 6.1.3からEF 6.1.1にダウングレードすることでした。

Visual Studios 2012+に移動:

ツール-Nuget Package Manager-パッケージマネージャーコンソール `

次に入力してください:

インストールパッケージEntityFramework.SqlServerCompact-バージョン6.1.1

上記のコマンドは既にそれを行っているため、最初にEF 6.1.3をアンインストールする必要はありませんでした。

さらに、それが何かをしたかどうかはわかりませんが、SQL Server CEもプロジェクトにインストールしました。

ここに私が見つけた解決策へのリンクがあります:

http://www.itorian.com/2014/11/no-entity-framework-provider-found-for.html

2
Omar

次のランタイムアセンブリバインディングを追加してみてください。

<runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
2
SynerCoder

私も同じ問題を抱えていましたが、Uninstall-Packageを使用して各プロジェクトからエンティティフレームワークパッケージをアンインストールするだけで問題は解決しました。そして、ソリューション全体で再びそれをインストールします。インストールするプロジェクトを選択するように求められます。すべてを選択する必要があります。

2
tavo

「EntityFramework.SqlServer.dll」をbinフォルダーに追加します。問題は解決されます。

1
vishal

私も同様の問題がありました

私の問題は次のことで解決しました:

enter image description here

enter image description here

1
BehrouzMoslem

この問題は、エンティティフレームワークの参照が間違っているか、クラス名がデータベースのエンティティ名と一致しないことが原因である可能性があります。テーブル名がクラス名と一致することを確認してください。

1
Ranjan

NuGet Package Manager orelse OpenTools-Nuget Package Manager-Package Manager Consoleから各プロジェクト(例:Web、クラスライブラリ)にEntity Frameworkをインストールします。 Install-Package EntityFrameworkを使用して、Entity Frameworkをインストールします。

すべての設定ファイルに以下のコードを追加する必要はありません。デフォルトでは、Entity Frameworkを介してデータベースが呼び出されるプロジェクトに追加されます。

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

1
Chandan Y S