找不到具有不变名称“System.Data.SqlServerCe.4.0”的ADO.NET提供程序的实体框架提供程序

时间:2013-11-06 19:42:23

标签: entity-framework c#-4.0 sql-server-ce

当我使用sqlce 4.0 with entityframework 6.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.但无济于事。

任何关于此的线索都会非常明显。

12 个答案:

答案 0 :(得分:56)

安装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的行。)

答案 1 :(得分:21)

ErikEJ指出了这一点,但我想突出一点,你必须记得安装Nuget包

EntityFramework.SqlServerCompact

我尝试按照建议的答案,但没有意识到我没有App.config引用所需的NuGet包。

答案 2 :(得分:6)

我在单元测试中遇到了这个问题。棘手的是错误不是经常出现的。 我设法通过添加以下类来解决它我的单元测试解决方案:

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

答案 3 :(得分:5)

要实现此目的,您只需在Package Manager控制台中注册EntityFramework.SqlServerCompact

要打开电源管理器控制台并输入以下命令:

PM> Install-Package EntityFramework.SqlServerCompact

答案 4 :(得分:1)

我的问题是单元测试。您可能只为项目安装了Entity框架,但没有安装单元测试。为此:

右击&#34;解决方案&#34;在解决方案资源管理器中(不是您的项目名称)

点击&#34;管理NuGet包&#34;

搜索EntityFramework并按下

您可能看不到[项目名称]旁边的勾号。测试

答案 5 :(得分:1)

用户PC上出现此错误。用户忽略了先前的错误“'DbProviderFactories'部分每个配置文件只能出现一次”。

显然,DB2通过添加重复(和空)<DbProviderFactories />标记来损坏其PC上的计算机配置文件。

解决方案是删除空的重复标记。机器配置文件位于[WindowsDir] \ Microsoft.Net \ Framework [.NET Version] \ Config \ Machine.config

答案 6 :(得分:1)

解决此问题

Visual Studio菜单 - &gt;工具 - &gt; NuGet包管理器 - &gt;管理NuGet包以获得解决方案

选择&#39;浏览&#39;选项卡并搜索以下&#39; EntityFramework.SqlServerCompact &#39;

安装它。

它应该有用。

答案 7 :(得分:1)

提供的解决方案是正确的,但它没有解释为什么EF需要这个程序集。这就是为什么......

默认情况下,EF的配置允许您拥有&#34; defaultConnectionFactory&#34; uder entityFramework部分。此默认工厂配置为&#34; LocalDbConnectionFactory&#34;它的参数是&#34; mssqllocaldb&#34;。

这个工厂内部需要&#34; SqlServerCe.4.0&#34;即&#34; SqlServerCompact&#34;。

仅当EF在DbContext中使用其默认连接字符串时才会发生错误。如果在配置中为EF提供了一些其他指定的连接字符串,则不会出现此错误。因为默认情况下EF使用默认连接工厂。

安装&#34; SqlServerCe 4.0&#34;改变EF的配置和&#34; LocalDbConnectionFactory&#34;它的参数是&#34; mssqllocaldb&#34;被替换为&#34; SqlServer Ce 4.0&#34;。并且EF运行时也能够找到SqlServerCe4.0程序集(因为它现在是您的引用的一部分并且实际放置在您的BIN中)。

以下是安装Sql Server Compact之前和之后的EF Config

OLD配置:

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

答案 8 :(得分:0)

不要忘记Package Manager Console将app.config / web.config从选定的Startup项目中取出来!

答案 9 :(得分:0)

对我来说,因为程序员不仅仅是一个,一些程序员已经安装了EntityFramework.SqlServerCompact,但是当我拉入我的PC并且RUN显示上面的错误信息时,我只是卸载并重新安装。

答案 10 :(得分:0)

在Visual Studio中,loginFormId文件夹中存在的所有hidden文件都需要设置为.dll_bin_deployableAssemblies

对我来说,所有.dll文件都设置为Build Action

这是我设置的,它在之后立即起作用:

enter image description here

答案 11 :(得分:0)

我将下面的提供程序代码添加到data_hum = pd.melt(data,id_vars=['time'],value_vars=['hum_1','hum_2']) fig = go.Figure() fig.add_trace(go.Scatter(x=data_hum['time'], y=data_hum['hum_1'], mode='lines+markers', name='Legend label 1')) fig.add_trace(go.Scatter(x=data_hum['time'], y=data_hum['hum_2'], mode='lines+markers', name='Legend label 2')) ,并同时安装Web.config软件包,然后解决问题。

如果缺少一个,它将失败。

EntityFramework.SqlServerCompact