20

我在带有 SQL Compact 的桌面应用程序中使用 Entity Framework 4。我想在我的应用程序中使用 SQL Compact 的私有安装,这样我的安装程序就可以安装 SQL Compact,而无需让用户进行第二次安装。它还避免了版本控制的麻烦。

我的开发机器安装了 SQL Compact 3.5 SP1 作为公共安装,所以我的应用程序在那里运行良好,正如人们所期望的那样。但它没有在我的测试机器上运行,它没有安装 SQL Compact。我收到此错误:

The specified store provider cannot be found in the configuration, or is not valid.

我知道有些人在使用 SQL Compact 私有安装时遇到了困难,但我已经使用了一段时间,我真的很喜欢它们。不幸的是,我的常规私人安装方法不起作用。我检查了我的 SQL CE 文件上的版本号,它们都是 3.8.8078.0,即 SP2 RC 版本。

以下是我在私人安装中包含的文件:

  • sqlcecompact35.dll
  • sqlceer35EN.dll
  • sqlceme35.dll
  • sqlceqp35.dll
  • sqlcese35.dll
  • System.Data.SqlServerCe.dll
  • System.Data.SqlServerCe.Entity.dll

我已经在我的项目中添加了对 System.Data.SqlServerCe 的引用,并且我已经验证上面列出的所有文件都被复制到安装机器上的应用程序文件夹中。

这是我在打开 SQL Compact 文件时用来配置 EntityConnectionStringBuilder 的代码:

var sqlCompactConnectionString = string.Format("Data Source={0}", filePath);

// Set Builder properties
builder.Metadata = string.Format("res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", edmName);
builder.Provider = "System.Data.SqlServerCe.3.5";
builder.ProviderConnectionString = sqlCompactConnectionString;
var edmConnectionString = builder.ToString();

我错过了一个文件吗?我是否缺少告诉实体框架在哪里可以找到我的 SQL Compact DLL 所需的配置步骤?为什么 EF 没有在安装机器上找到我的 SQL Compact DLL 的任何其他建议?谢谢你的帮助。

4

5 回答 5

37

感谢Steve Lasker 的博客文章,我想出了如何做到这一点。基本上,这是你必须做的:

System.Data.SqlServerCe.dll(1)在您的项目中设置对的引用。将该CopyLocal属性设置为 True。

(2) 在您项目的 App.config 中,添加以下 XML 标记。它告诉 EntityFramework 为它的数据提供者寻找你私人安装的 SQL Compact:

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

(3) 在Setup项目中,在File System Editor中的Application Folder中添加以下文件:

  • sqlcecompact35.dll
  • sqlceme35.dll
  • sqlcese35.dll
  • System.Data.SqlServerCe.Entity.dll
于 2010-03-30T00:02:09.160 回答
22

仅作记录,对于 SQL CE 4,web.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.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
  </system.data>

Version= 4.0.0.1在私有部署的情况下和 Version= 4.0.0.0在一般部署的情况下。

于 2011-02-17T02:04:10.860 回答
2

谢谢你的小费-帮了我很多。SQL Server Compact-Team 博客上有一篇文章,其中为 Sql Server Compact 3.5 SP2 版本添加了一些附加信息。

在为 sql server compact 的私有部署挣扎了一段时间后,我发现了一些额外的要求。

我在几个不同的系统上试用了我的应用程序,发现我的应用程序在其中一些系统上无法正常工作。

示例:试试这个:

-我已经设置了一个干净的 winxp sp3 安装

- 安装了 .net Framework 4.0 扩展

- 将我的应用程序部署到新安装(包括您的/sql server compact 团队博客文章中描述的所有必要的 dll 和调整)

因此,经过一些研究,我发现除了 .net framework 4 安装之外,我还必须安装 .net framework 2 并且它运行良好。

所以这是我的问题:.net framework 4 中不包含的 sql server 精简版使用了哪个组件?

我不想超载我的设置并将两个框架链接到我的引导程序......有人知道任何好的提示吗?

非常感谢 sql server compact 团队!

SQL Server Compact v3.5 依赖于“Visual C++ Runtime 2005(或 8.0)”(也称为 CRT80)。我们将 CRT80 模块封装在我们的 MSI 中。在私有部署的情况下,

你需要照顾这种依赖。由于 .NET FX v2.0 还打包和安装 CRT80 模块,因此系统会自动使用 .NET FX v2.0。

谢谢

于 2010-06-24T08:09:39.013 回答
1

这对我有用:

你有一个 dotNet 2.0 和 4.0 版的 machine.config 文件:

点网 2.0

C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
点网4.0
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config

如果您打开 2.0 版的文件,您会看到它有一个 <system.data> 节点,它可能看起来像这样:

<system.data>
    <DbProviderFactories>
        <add name="Odbc Data Provider" ... stuff here ... />
        <add name="OracleClient Data Provider" ... stuff here ...>
        ... more lines similar to the one above ...
        <add name="Microsoft SQL Server Compact Data Provider" Invariant="System.Data.SqlServerCe.3.5" ...>
    </DbProviderFactories>
</system.data>

然而,如果你为 dotNet 4.0 打开一个,它看起来更像:

<system.data>
    <DbProviderFactories>        
    </DbProviderFactories>
</system.data>

或者它甚至根本没有 <system.data> 节点!!!在任何一种情况下,只需将 <system.data> 节点从 v2 的 machine.config 文件完整复制到 v4 的那个。

边注

如果您在保存对 v4 machine.config 的编辑时遇到问题,那么您可能需要在单击编辑器启动图标时右键单击几次才能以管理员模式运行。

于 2011-11-10T19:01:45.137 回答
0

被同样的问题困住,

“在配置中找不到指定的商店提供程序或无效。”

我绕过这个帖子。我几乎尝试了一切。我已经使用 nugets安装了“ System.Data.SqlServerCe ”。

所以我已经在我的 web.config 中添加了以下代码行

<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" />
  <!--<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />-->
  <!--<add name="Microsoft EntityClient" invariant="System.Data.EntityClient.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.EntityClient, System.Data.EntityClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />-->
</DbProviderFactories>

仍然错误继续..

我通过取消注释上面代码中的最后两行注释来解决问题......所以现在它变成了

<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" />
  <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
  <add name="Microsoft EntityClient" invariant="System.Data.EntityClient.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.EntityClient, System.Data.EntityClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>

希望它有帮助..谢谢。

于 2013-09-04T12:15:46.507 回答