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="data source=|DataDirectory|\FBMultipleOrderSync.sdf"" providerName="System.Data.EntityClient" />
</connectionStrings>
...
EF 6を再インストールしようとしましたが、役に立ちませんでした。
これについての手がかりはかなり理解できるでしょう。
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の行を残すことができます。)
ErikEJはこれを指摘しましたが、事実を強調したいので、Nugetパッケージをインストールすることを忘れないでください
EntityFramework.SqlServerCompact
推奨された回答に従ってみましたが、App.configが参照している必要なNuGetパッケージがないことに気づきませんでした。
私はユニットテストで問題に遭遇しました。厄介なことは、エラーが常に表示されていなかったことです。私は私のユニットテストソリューションに次のクラスを追加することでそれを解決することができました:
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;
}
}
これを実現するには、パッケージマネージャーコンソールでEntityFramework.SqlServerCompact
を登録するだけです。
これを行うには、パワーマネージャーコンソールを開き、以下のコマンドを入力します。
PM> Install-Package EntityFramework.SqlServerCompact
私の問題は単体テストでした。おそらく、プロジェクト用のEntityフレームワークのみをインストールし、ユニットテストはインストールしていません。そうするには:
ソリューションエクスプローラーで[ソリューション]を右クリックします(プロジェクト名ではありません)
「NuGetパッケージの管理」をクリックします
EntityFrameworkを検索して押します
[プロジェクト名] .Testsの横にチェックマークはおそらく表示されません。
提供されたソリューションは正しいですが、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>
この問題を解決するには
Visual Studioメニュー->ツール-> NuGetパッケージマネージャー->ソリューションのNuGetパッケージの管理
「参照」タブを選択し、次の「EntityFramework.SqlServerCompact」を検索します
それをインストールします。
動作するはずです。
このエラーはユーザーPCで発生しました。ユーザーは以前のエラー「「DbProviderFactories」セクションは設定ファイルごとに1回しか表示できません」を無視しました。
どうやらDB2は、重複(および空)を追加することにより、PC上のマシン構成ファイルを破損しました<DbProviderFactories />
タグ。
解決策は、空の重複タグを削除することでした。マシン構成ファイルは[WindowsDir]\Microsoft.Net\Framework [.NET Version]\Config\Machine.configにあります
パッケージマネージャーコンソールは、スタートアッププロジェクトとして選択されたapp.config/web.configを取得することを忘れないでください!
私にとって、プログラマーは1人だけではないため、一部のプログラマーは既にEntityFramework.SqlServerCompactをインストールしていますが、PCをプルしてRUNが上記のエラーメッセージを表示したら、アンインストールして再度インストールします。