36

将 sqlce 4.0 与 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。但无济于事。

任何关于这方面的线索都会非常明显。

4

12 回答 12

59

安装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 保留该行。)

于 2013-11-06T21:18:55.907 回答
21

ErikEJ 指出了这一点,但我想强调一个事实,你必须记住安装 Nuget 包

EntityFramework.SqlServerCompact

我尝试遵循推荐的答案,但没有意识到我没有 App.config 引用的所需 NuGet 包。

于 2013-12-29T13:07:53.923 回答
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;
    }
}
于 2014-09-03T08:38:16.660 回答
5

要实现这一点,您只需要EntityFramework.SqlServerCompact在包管理器控制台中注册,

为此,请打开电源管理器控制台并键入以下命令:

PM> Install-Package EntityFramework.SqlServerCompact
于 2014-06-09T21:31:50.440 回答
2

为了解决这个问题

Visual Studio 菜单 -> 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet 包

选择“浏览”选项卡并搜索以下“ EntityFramework.SqlServerCompact

安装它。

它应该工作。

于 2016-11-08T01:55:01.960 回答
1

我的问题是单元测试。您可能只为您的项目安装了实体框架,而不是您的单元测试。为此:

在解决方案资源管理器中右键单击“解决方案”(不是您的项目名称)

单击“管理 NuGet 包”

搜索 EntityFramework 并按下它

您可能不会在 [Project Name].Tests 旁边看到勾号

于 2015-12-28T22:48:29.363 回答
1

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

<DbProviderFactories />显然,DB2 通过添加一个重复的(和空的)标签破坏了她 PC 上的机器配置文件。

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

于 2016-02-25T16:47:39.163 回答
1

提供的解决方案是正确的,但它没有解释为什么 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 Config

旧配置:

<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>
于 2017-04-27T12:25:38.400 回答
0

不要忘记包管理器控制台从选定的启动项目中获取 app.config/web.config !

于 2014-08-25T13:20:13.887 回答
0

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

于 2017-05-02T22:55:53.537 回答
0

在 Visual Studio 中,文件夹.dll中存在的所有文件都_bin_deployableAssemblies需要设置为Build Actionnone

我所有的 .dll 都设置为content.

这就是我设置的,它在之后立即工作:

在此处输入图像描述

于 2018-11-24T15:40:45.843 回答
0

我将下面的提供程序代码添加到Web.config, 并安装EntityFramework.SqlServerCompact包,然后解决问题。

如果缺少一个,它就会失败。

<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact"/>
于 2020-08-05T09:10:29.400 回答