将实体框架与SQL Compact专用安装一起使用

时间:2010-03-29 19:47:38

标签: entity-framework sql-server-ce entity-framework-4

我在使用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私有化安装方面遇到了困难,但I have used them for a while,我真的很喜欢它们。不幸的是,我的常规私人安装方法不起作用。我已经检查了我的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();

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

5 个答案:

答案 0 :(得分:37)

由于blog post by Steve Lasker,我想出了如何做到这一点。基本上,这是你必须做的:

(1)在项目中设置对System.Data.SqlServerCe.dll的引用。将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)在安装项目中,将以下文件添加到文件系统编辑器中的应用程序文件夹:

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

答案 1 :(得分: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>
如果是私有部署,则

版本= 4.0.0.1 ;如果是常规部署,则 4.0.0.0

答案 2 :(得分:2)

感谢您的提示 - 帮助了我很多。 有一个post on the SQL Server Compact-Team blog,它为Sql Server Compact 3.5 SP2版本添加了一些额外的信息。

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

我在几个不同的系统上试用了我的应用,并认识到我的应用在其中一些系统上无法正常工作。

示例:试试这个:

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

- 安装.net Framework 4.0扩展

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

因此,经过一些研究后我发现,除了.net框架4安装外,我还必须安装.net框架2并且工作正常。

所以这是我的问题:sql server compact edition使用哪个组件,它不包含在.net框架4中?

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

非常感谢sql server compact Team!

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

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

由于

答案 3 :(得分:1)

这对我有用:

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

dotNET 2.0     

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

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

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

或许它甚至没有&lt; system.data&gt;节点!在任何一种情况下,只需复制&lt; system.data&gt;完整的节点从v2的machine.config文件到v4的那个。

SIDE NOTE

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

答案 4 :(得分:0)

遇到同样的问题,

&#34;在配置中找不到指定的商店提供商或无效。&#34;

我来到这个帖子。 我几乎尝试了一切。 我安装了&#34; System.Data.SqlServerCe &#34;使用nugets。

所以我已经在我的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>

希望它有帮助.. 感谢。