web-dev-qa-db-ja.com

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

EntityFramework 6とCode Firstを使用しています。 EntityFrameworkへの参照はないが、App.configから接続文字列を読み取るコンソールアプリがあります。接続文字列をパラメーターとして渡して、DatabaseInitializationUtilitiesアセンブリを呼び出します。

DatabaseInitializationUtilitiesには、EF6(EntityFrameworkおよびEntityFramework.SqlServer)への参照があります。その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>
     <system.serviceModel>
         <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IAuthentication" />
            </basicHttpBinding>
         </bindings>
         <client>
            <endpoint address="http://localhost/SecurityServices/Authentication.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAuthentication" contract="SecurityService.IAuthentication" name="BasicHttpBinding_IAuthentication" />
         </client>
      </system.serviceModel>
      <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>
   </configuration>

DatabaseInitializationUtilitiesがスクリプトを実行しようとする行に実行が到達したとき

context.Database.ExecuteSqlCommand(script.ScriptText)

エラーがスローされます:

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

救済策は設定ファイルにあるものとまったく同じであると思うので、問題を理解していません。

注:Resharperはノードをブルーライン化し、「要素 'EntityFramework'に無効な子要素 'providers'があります。しかし、EF6をインストールしたときにセクションがNuGetによって挿入されました」と報告しています。

何か案は?

36
Dewey

参照を作成する必要があるため、デバッグフォルダーにコピーされます。したがって、後でランタイムでアクセスできます。

ファイルをコピーしないで、この参照を作成してください:

private volatile Type _dependency;

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

アプリケーションパスにAssembly EntityFramework.SqlServer.dllがありますか?私は同じ問題を抱えており、dllをアプリケーションパスにコピーした後、すべてのものがうまくいきました。

17
Thomas

このブログで最終的に答えを見つけました:

http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html

13
Motty

私もこの問題を抱えていました。 .net mvcアプリを実行したときにすべてがローカルで機能しましたが、公開したときにこのエラーが発生しました。問題は、WebプロジェクトでもEntityFrameworl.SqlServerを参照する必要があったことですが、データ用に別のプロジェクトがありました。奇妙なのは、このエラーはアプリの公開時にのみスローされたことです。これはおそらくMicrosoftの重大なバグです。 EF 6.1.1を使用しました。

5
TheMentor

それの訳は EntityFramework.SqlServer.dllはプロジェクトにコピーされません。そのdllを追加すると、うまくいけばうまくいきます。データモデルを追加したプロジェクトから見つけることができます。

4
Baqer Naqvi

私にとっては、web.configファイル内のプロバイダー参照が正しくないことがわかりました。 nugetパッケージにプロバイダーが適切に含まれていない可能性があると思います。

私はこれをプロバイダーに置き換えましたが、うまくいきました:

  <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>
2
David Price

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

私の問題は以下を行うことで解決しました: enter image description here

enter image description here

0
BehrouzMoslem

プロジェクトのbinフォルダーに「EntityFramework.SqlServer.dll」を追加すると、問題が解決します。

0
vishal

Webプロジェクトと、実際にそれを参照するアセンブリにEntityFrameworkを追加する傾向があります。

0
David Hyde

この種の問題に対処するための最善の方法は、参照EntityFramework.SqlServer.dllをプロジェクトに含めることです。F4キーを押して(プロパティを操作)、プロパティをLocal = Trueにコピーします。アプリは公開されたフォルダにコピーされます。

0
Muhammad Saqib