web-dev-qa-db-ja.com

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

Entityframework 6.0でsqlce 4.0を使用すると、次のエラーが発生しました

No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlServerCe.4.0'

私のapp.configは次のようになります

....
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
  <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 --></configSections>
 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" >
      <parameters>
        <parameter value =" System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <!--providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers-->
  </entityFramework>
  <connectionStrings>
    <add name="FbMultipleInsOrderContainer" connectionString="metadata=res://*/FbMultipleInsOrder.csdl|res://*/FbMultipleInsOrder.ssdl|res://*/FbMultipleInsOrder.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;data source=|DataDirectory|\FBMultipleOrderSync.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
...

EF 6を再インストールしようとしましたが、役に立ちませんでした。

これについての手がかりはかなり理解できるでしょう。

35
kuhajeyan

EntityFramework.SqlServerCompact nugetパッケージをインストールした後、app.configに次のものが含まれていることを確認します(上記の@ErikEJのコメントによる)。

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>

(本当に必要ない場合でも、SqlClientの行を残すことができます。)

57
Olly

ErikEJはこれを指摘しましたが、事実を強調したいので、Nugetパッケージをインストールすることを忘れないでください

EntityFramework.SqlServerCompact

推奨された回答に従ってみましたが、App.configが参照している必要なNuGetパッケージがないことに気づきませんでした。

21
David Chiew

私はユニットテストで問題に遭遇しました。厄介なことは、エラーが常に表示されていなかったことです。私は私のユニットテストソリューションに次のクラスを追加することでそれを解決することができました:

public static class Trick
{
    public static void FixEfProviderServicesProblem()
    {
        // this commented line should be used for SQL Server provider
        //var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

        // this is used for SQL Server CE provider
        var instance = System.Data.Entity.SqlServerCompact.SqlCeProviderServices.Instance;
    }
}
6
Yaugen Vlasau

これを実現するには、パッケージマネージャーコンソールでEntityFramework.SqlServerCompactを登録するだけです。

これを行うには、パワーマネージャーコンソールを開き、以下のコマンドを入力します。

PM> Install-Package EntityFramework.SqlServerCompact
5
AKS

私の問題は単体テストでした。おそらく、プロジェクト用のEntityフレームワークのみをインストールし、ユニットテストはインストールしていません。そうするには:

ソリューションエクスプローラーで[ソリューション]を右クリックします(プロジェクト名ではありません)

「NuGetパッケージの管理」をクリックします

EntityFrameworkを検索して押します

[プロジェクト名] .Testsの横にチェックマークはおそらく表示されません。

1
KSHMR

提供されたソリューションは正しいですが、EFがこのアセンブリを必要とする理由を説明していません。ここに理由があります...

デフォルトでは、EFの構成により、entityFrameworkセクションの下に「defaultConnectionFactory」を設定できます。このデフォルトファクトリは「LocalDbConnectionFactory」に設定され、そのパラメータは「mssqllocaldb」です。

このファクトリは、内部的に「SqlServerCe.4.0」、つまり「SqlServerCompact」を必要とします。

このエラーは、EFがDbContextでデフォルトの接続文字列を使用している場合にのみ発生します。 EFが構成で指定された他の接続文字列とともに提供されている場合、このエラーは表示されません。 EFはデフォルトでデフォルトの接続ファクトリを使用するためです。

「SqlServerCe 4.0」をインストールすると、EFの構成が変更され、「LocalDbConnectionFactory」とそのパラメーターが「mssqllocaldb」が「SqlServer Ce 4.0」に置き換えられます。また、EFランタイムはSqlServerCe4.0アセンブリを見つけることもできます(現在は参照の一部であり、BINに物理的に配置されているため)。

以下は、SQL Server Compactをインストールする前後のEF構成です。

旧構成:

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

新しい構成は次のとおりです。

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
    </providers>
  </entityFramework>

また、新しいファクトリを説明する次のセクションを追加しました

<system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SqlServerCe.4.0" />
      <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
  </system.data>
1
SherjilAhmed

この問題を解決するには

Visual Studioメニュー->ツール-> NuGetパッケージマネージャー->ソリューションのNuGetパッケージの管理

「参照」タブを選択し、次の「EntityFramework.SqlServerCompact」を検索します

それをインストールします。

動作するはずです。

1
Neville Dabreo

このエラーはユーザーPCで発生しました。ユーザーは以前のエラー「「DbProviderFactories」セクションは設定ファイルごとに1回しか表示できません」を無視しました。

どうやらDB2は、重複(および空)を追加することにより、PC上のマシン構成ファイルを破損しました<DbProviderFactories />タグ。

解決策は、空の重複タグを削除することでした。マシン構成ファイルは[WindowsDir]\Microsoft.Net\Framework [.NET Version]\Config\Machine.configにあります

1
ActualRandy

パッケージマネージャーコンソールは、スタートアッププロジェクトとして選択されたapp.config/web.configを取得することを忘れないでください!

0
mr_squall

Visual Studio内では、.dllフォルダーに存在するすべての_bin_deployableAssembliesファイルをBuild Actionに設定する必要があります:none

私のすべての.dllはcontentに設定されていました。

これは私が設定したものであり、すぐに機能しました:

enter image description here

0
Dave

私にとって、プログラマーは1人だけではないため、一部のプログラマーは既にEntityFramework.SqlServerCompactをインストールしていますが、PCをプルしてRUNが上記のエラーメッセージを表示したら、アンインストールして再度インストールします。

0
Haryono