web-dev-qa-db-ja.com

不変名 'System.Data.SqlClient'を持つADO.NETプロバイダーのEntity Frameworkプロバイダーが見つかりませんでした

NugetでEF6をダウンロードして私のプロジェクトを実行しようとすると、次のエラーが返されます。

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

enter image description here

503

私はちょうど同じ問題に遭遇しました、そしてそれはNuGetパッケージマネージャからインストールされたけれどもEntityFrameworkのように見えますプロジェクトに正しくインストールされませんでした。

私は パッケージマネージャコンソール で次のコマンドを実行することでそれを修正することができました。

PM> Install-Package EntityFramework
553
douglaslps

クラスライブラリプロジェクトにEFを追加しました。また、それを参照するプロジェクト(コンソールアプリ、Webサイトなど)に追加する必要もあります。

362
Clément Picou

コンソールアプリケーションにEntity Frameworkをインストールする必要はありません。アセンブリEntityFramework.SqlServer.dllへの参照を追加するだけです。このアセンブリをEntity Frameworkを使用するクラスライブラリプロジェクトからLIBフォルダーにコピーして、それへの参照を追加できます。

要約すれば:

  • クラスライブラリアプリケーション:
    • Entity Frameworkをインストールする
    • データレイヤコードを書く
    • app.configファイルには、接続文字列を除いてEntity Frameworkに関連するすべての設定があります。
  • コンソール、Webまたはデスクトップアプリケーションを作成します。
    • 最初のプロジェクトへの参照を追加します。
    • EntityFramework.SqlServer.dllへの参照を追加します。
    • app.config/web.configには接続文字列があります(設定エントリの名前はDbContextクラスの名前と同じである必要があります)。

助けになれば幸いです。

195

このメッセージは、「EntityFramework.SqlServer.dll」を含めることを忘れた場合にも表示されます。

EF6で新しく追加されたファイルのようです。当初、私はそれを私のマージモジュールに含めていなかったし、ここに挙げた問題に出くわした。

110
Mike

ホストプロジェクトにEntityFramework.SqlServerを追加する代わりに、モデル/エンティティプロジェクトからこのように静的参照を確実にすることができます。

static MyContext()
{
    var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    if(type == null)
        throw new Exception("Do not remove, ensures static reference to System.Data.Entity.SqlServer");
}

これにより、ビルドプロセスにアセンブリとホストプロジェクトが含まれます。

私のブログでの詳細情報 http://andersmalmgren.com/2014/08/20/implicit-dependencies-and-copy-local-fails-to-copy/

46
Anders

Nugetを介してEntity Framework 6を​​インストールする場合。 EntityFramework.SqlServerは他の実行ファイルを見逃すことがあります。そのプロジェクトにNugetパッケージを追加するだけです。

上記のテストプロジェクトではうまくいかないことがあります

Test Projectでこの問題を解決するには、このメソッドをTest Project内に配置するだけです。

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

このメソッドは呼び出されることはありませんが、私の観察によると、コンパイラはすべての「不要な」アセンブリを削除し、EntityFramework.SqlServerを使用せずにテストは失敗します。

45
Umar Abbas

この機能を追加

private void FixEfProviderServicesProblem()

ライブラリクラスのデータベースコンテキストクラスに追加し、不足しているDLL EntityFramework.SqlServer.dllを正しい場所にコピーします。

namespace a.b.c
{
    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    {
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        {
        }

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions { get; set; }
        public virtual DbSet<WorkflowInstance> WorkflowInstances { get; set; }
        public virtual DbSet<EngineAlert> EngineAlerts { get; set; }
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems { get; set; }
        public virtual DbSet<TaskItem> TaskItems { get; set; }
        public virtual DbSet<TaskItemLink> TaskItemLinks { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }

        private void FixEfProviderServicesProblem()
        {
            // The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
            // for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
            // Make sure the provider Assembly is available to the running application. 
            // See http://go.Microsoft.com/fwlink/?LinkId=260882 for more information.
            var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        }
    }
}

21
Johannes

これらのどれも私のために働きませんでした。私は 他のstackoverflow問題 で解決策を見つけました。簡単に参照できるようにここに追加します。

参照を作成する必要があるので、それはアプリケーションパスにコピーされます。後で実行時に参照されるためです。ですから、ファイルをコピーする必要はありません。

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
19
Carra

SQL Server Compact 4.0でEntity Framework 6を​​使用しているときに同じエラーが発生しました。 EF6用の Entity Framework Providers に関するMSDNの記事は役に立ちました。 NuGetパッケージも自動的にconfigファイルに登録を追加するため、Package Managerコンソールでそれぞれのプロバイダコマンドをnugetパッケージとして実行すると問題が解決する場合があります。問題を解決するためにPM> Install-Package EntityFramework.SqlServerCompactを実行しました。

8
MaySara

テストプロジェクトでエラーが発生したときの最も良い解決策は、テストクラスを次のように修飾することです。

[DeploymentItem("EntityFramework.SqlServer.dll")]
7
Alberto Juan

それぞれが異なるプロジェクトにあるWebサービスのセット、およびそれらのサービスのいくつかのための統合テストを含む別々のプロジェクトを扱うときに、今日この問題を調べてください。

私はEF 5でこのセットアップをしばらく使っていましたが、統合テストプロジェクトからEFへの参照を含める必要はありませんでした。

EF6にアップグレードした後は、EF6への参照を統合テストプロジェクトに含める必要があるようです。( user3004275 で指摘したように) 。

あなたが同じ問題に直面している徴候:

  • EFへの呼び出し(DBへの接続、データの取得など)は、EF6への参照があるプロジェクトから開始されている限り、正常に機能します。
  • サービスへの呼び出し公開されているサービスインターフェイス経由 _正常に動作します。すなわち、サービス内に「内部的に」欠けている参照はありません。
  • サービスプロジェクト内で直接パブリックメソッドにを呼び出すと、そのプロジェクト自体でEFが使用されていなくても、このエラーが発生します。呼び出されたプロジェクトの内部でのみ

3番目のポイントはしばらくの間私をやめさせたことです、そしてなぜ私はこれが必要とされるのかまだわかりません。私の統合テストプロジェクトでEF6に参照を追加することは、いずれにせよそれを解決しました...

6
Kjartan

Entity Frameworkが使用されているプロジェクトを参照するスタートアッププロジェクトには、そのbinフォルダーに次の2つのアセンブリが必要です。

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

スタートアッププロジェクトの.configファイルの<section><configSections>を追加すると、そのbinディレクトリで最初のアセンブリが利用可能になります。これをEntity Frameworkプロジェクトの.configファイルからコピーできます。

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

2番目の.dllをbinフォルダーで使用可能にするには、実用的ではありませんが、Entity Frameworkプロジェクトのbinフォルダーから手動でコピーを作成できます。より良い方法は、Entity Frameworkプロジェクトのビルド後のイベントに次の行を追加することです。これにより、プロセスが自動化されます。

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\
4
Leonel B.

私は今日この問題に遭遇したところです。テスト用のEF63 NuGetパッケージおよびコンソールアプリケーションを含むデータリポジトリクラスライブラリがあります。これらはクラスライブラリプロジェクトのみを参照しています。私はクラスライブラリのBin\DebugフォルダからコンソールアプリケーションのBin\DebugフォルダにEntityFramework.SqlServer.dllをコピーする非常に単純なビルド後コマンドを作成し、問題を解決しました。コンソールアプリケーションの.configファイルにentityFrameworkセクションを追加することを忘れないでください。

4
Ondřej

下記をapp.configに追加してください。

 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
3
Taran

BINフォルダを削除すると私のためにそれをやった

3
David

EntityFramework.SqlServer.dllアセンブリへの静的参照を強制する必要がありますが、ダミーコードを配置する代わりに、より美しい方法でこれを実行できます。 :

  1. すでにDbConfigurationクラスがある場合

    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        }
    }
    
  2. DbConfigurationクラスがない場合は、アプリの起動時に次のコードを追加する必要があります(EFが使用される前)。

    static MyContext()
    {
        DbConfiguration.Loaded += (sender, e) =>
            e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
    
3

Nugetを使用してEntity Frameworkを再インストールしました。そして以下のリンクに書かれた指示に従ってください: http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

私は問題が解決すると思います。

2
Kuntal Ghosh

私も同様の問題を抱えていました。私の問題は次のようにすることで解決されました:

enter image description here

enter image description here

2
BehrouzMoslem

私は1つのコンソールアプリケーションとクラスライブラリを持っていました。クラスライブラリでEntity Data Modelを作成し([クラスライブラリ]> [追加]> [新しい項目]> [データ]> [ADO.NET Entity Data Model 6.0]を右クリック)、コンソールアプリケーション内に参照を置きます。それで、あなたはクラスライブラリへの参照を持っているコンソールアプリケーションとあなたがEFモデルを持っているクラスライブラリの中にいます。テーブルからレコードを取得しようとしたときに同じエラーが発生しました。

次の手順でこの問題を解決しました。

  1. ソリューションを右クリックして、[ソリューション用のNuGetパッケージの管理]オプションを選択すると、NuGetパッケージマネージャウィンドウが表示されます。
  2. [インストール済みパッケージ]の下の[管理]オプションに移動します。ヒント:Entity Frameworkがクラスライブラリに追加されたため、[インストール済みパッケージ]の下にEntityFrameworkが表示され、[管理]オプションが表示されます。
  3. [管理]オプションをクリックして、EFモデルを保持するクラスライブラリを参照するプロジェクトにパッケージをインストールするようにチェックします(私の場合は、EFモデルを含むクラスライブラリを参照するコンソールアプリケーションにパッケージをインストールするチェックボックスを設定します)

それが私がしなければならなかったすべてであり、すべてが完璧に機能しました。

お役に立てば幸いです。

1
dkkd

また、起動プロジェクトがdbcontext(または関連するapp.config)を含むプロジェクトであることを確認してください。 Mineは必要な設定をすべて持っていないWebサイトプロジェクトを立ち上げようとしていました。

1
user2588362

私は同じエラーがあります。 dbContextを使って自分のモデルのどれかに問い合わせをしたり、以下のようなリストを取得したときに初めて起こるのは奇妙なことです。

var results = _dbContext.MyModel.ToList();

Entity Frameworkを再インストールしようとしました。正しく参照してください。

幸いなことに、NugetでALLソリューションをチェックしてから、すべてを更新するか、everythingが同じバージョンであることを確認してみました。2つのプロジェクトがWebプロジェクトで異なるEFバージョンを持っているためです。そしてそれはうまくいきます。エラーはなくなりました。

これは、すべてのソリューションでNugetを管理する方法のスクリーンショットです。

enter image description here

1
Willy David Jr

みんな私はあなたの注意が必要です2 dll EntityFramework.dllとEntityFramework.SqlServer.dllはDataAccessレイヤライブラリですそしてそれはビューやその他のlayer.itでそれらを使用することは論理的ではありませんがそれは論理的ではありません。

論理的な方法は、enitiess属性を削除してFluent APIに置き換えることです。これが本当の解決策です

1
Vahid Akbari

system.Data.SqlClientがシステムにインストールされているかどうか、およびそれが参照されているかどうかを最初に確認する人は誰もいないようです。

私はSystem.Data.SqlClientをインストールしてapp.Configに新しいプロバイダーを追加することで私の問題を解決しました

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
1
Tobi Owolawi

私は上記のほとんどすべてを試しましたが、何もうまくいきませんでした。

Default ProjectのEntityFrameworkプロパティとEntityFramework.SqlServerプロパティのCopy Localに参照されているDLLをTrueに設定したときだけ、それは動き始めました!

1
SharpC

YourModel.edmxファイルを展開し、YourModel.Context.ttの下のYourModel.Context.csクラスを開きます。

Usingセクションに次の行を追加したところ、エラーが修正されました。

sqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServicesを使用します。

ファイルが自動生成されるたびに、この行をファイルに追加する必要があります。

1
user2347528

メッセージが示すように、プロバイダーSystem.Data.SqlClientを追加する必要があるということは、2つのDLLを持つEntityFrameworkのnugetパッケージをインストールする必要がある理由ですが、コンソールアプリケーションのみを開発している場合はEntityFramework.SqlServer.dllの参照を追加するだけです。

0

注:ModelからDatabase Sqlを生成しているときにこの問題が発生しました。それはすべてのテーブルをうまく作成しましたが、変更をエクスポートしませんでした。注意すべきことは、このエラーはDDL生成テンプレートをSSDLtoSQL10として使用してSQLをエクスポートしようとしたときに生成されることです。ここでMySQL接続を期待しているので、ModelプロパティのDDL Generation Template SSDLtoMySQLのドロップダウンから必ず選択するようにしてください。この一日を過ごした!

0
Excalibur2000

私は同じ例外を投げました。含めた

using System.Data; 
using System.Data.Entity;

そして、すべてが再び機能するようになりました。

0
kneerunjun

私の場合、Resharperが問題の原因となったいくつかの変更を変更したと思うので、すべてが適切に機能していたのに突然機能しなくなりました。私のプロジェクトは、データ層、サービス層、そしてプレゼンテーション層に分けられました。 Entity Frameworkをデータ層にインストールして参照しましたが、それでもエラーは解消されませんでした。アンインストールと再インストールもうまくいきませんでした。最後に、でデータ層をスタートアッププロジェクトにし、移行を行い、データベースを更新し、スタートアッププロジェクトを自分のプレゼンテーション層に戻しました

0
Alf Moh

私は同じ問題を抱えていた、ちょうど私のテストプロジェクトにDBContextを含んでいたプロジェクトからApp Configファイルをコピーした

0

Azure上でCEデータベースからSqlサーバーに移行するときに、関連する問題がありました。これを解決するために4時間を無駄にしました。うまくいけば、これは誰かが同じような運命を救うかもしれません。私にとっては、私のpackages.configファイルにSqlCEへの参照がありました。それを削除することは私の問題全体を解決し、私が移行を使用することを可能にしました。不必要に複雑な設定と設定の問題を抱えた別の技術のYay Microsoft。

0
user2662643

EntityFramework.SqlServer.dllへの参照が不足しています。 SQL Serverを使用するEntityFrameworkプロジェクトの場合、参照する必要がある2つのファイルはEntityFramework.SqlServer.dllとEntityFramework.dllです。

0
user2956314

Web /コンソールプロジェクトにEntityFrameworkパッケージをインストールするだけです。これであなたの設定ファイルにセクションが追加されます。

0
Vijaya Malla