实体Framewok代码首先使用本地SQL Server CE DLL“找不到ADO.NET提供程序”

时间:2013-12-13 20:38:35

标签: c# .net entity-framework ef-code-first sql-server-ce

我正在编写一个使用SQL Server CE 4.0文件的C#应用​​程序,这些文件可以通过代码优先通过Entity Framework 6.0访问。 (应用程序需要能够使用本地dll进行SQL Server CE连接,即应用程序需要可以部署XCOPY)。应用程序在我的开发机器上运行良好,但在其他机器上(例如只有Win7和.NET 4.0的VM),我得到ArgumentException

  

具有不变名称“System.Data.SqlServerCe.4.0”的ADO.NET提供程序未在计算机或应用程序配置文件中注册,或者无法加载。有关详细信息,请参阅内部异常。

内部异常消息说:

  

无法找到请求的.Net Framework数据提供程序。它可能没有安装。

我搜索了Google和SO,大多数评论表明确保App.config文件正确无误。我相信我的(默认连接工厂和提供商部分),但这里是内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
  <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>
</configuration>

构建文件夹包含以下文件(当然还有特定于应用程序的文件):

  • EntityFramework.dll
  • EntityFramework.xml
  • EntityFramework.SqlServer.dll
  • EntityFramework.SqlServer.xml
  • EntityFramework.SqlServerCompact.dll
  • EntityFramework.SqlServerCompact.xml

在每个amd64和x86子文件夹中都有以下文件:

  • sqlceca40.dll
  • sqlcecompact40.dll
  • sqlceer40EN.dll
  • sqlceme40.dll
  • sqlceqp40.dll
  • sqlcese40.dll

我确信该程序在开发计算机上运行,​​因为已安装SQL Server CE,但如何在其他计算机上仅使用本地SQL Server CE dll运行它?

5 个答案:

答案 0 :(得分:22)

请参阅http://tech.aendeavors.com/2011/06/09/bin-deploy-sqlce-4-0-and-ef-4-1/

您可能遗漏的相关内容似乎是:

  • 确保引用System.Data.SqlServerCe并将其设置为“复制” 本地“在物业。

  • 将以下内容添加到app.config:


<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 :(得分:5)

我今天面临同样的问题 重新安装EF几次后,解决了我的问题是在我的Console项目中引用EF以及DAL项目(实际使用EF的项目)。

如果您使用的引用又引用了EF,您还必须将它添加到此项目中。

答案 2 :(得分:2)

对于迟到的回复感到抱歉 - 实际上,这是一个非常简单的解决方案:

如果您调查packages \ EntityFramework.6.1.3 \ lib \ net45文件夹,您会注意到还有另一个已经存在的dll - EntityFramework.SqlServer。

只需添加对它的引用,一切都会起作用。

答案 3 :(得分:0)

我有同样的问题,没有任何对我有用。解决我这个问题的唯一办法是从我的机器上卸载SQL Server Compact (通过添加/删除程序)并重新安装它。

答案 4 :(得分:0)

就我而言,缺少“ EntityFramework.SqlServerCompact”包。只是想分享一下,以防万一可以挽救别人的一天!