使用Entity Framework与SQL Compact私有安装

20

我在桌面应用程序中使用Entity Framework 4和SQL Compact。我想在我的应用程序中使用一个私有安装的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();

我是不是少了一个文件? 我是否需要配置Entity Framework告诉它我的SQL Compact DLLs在哪里找? 还有其他建议吗,为什么EF在安装机器上找不到我的SQL Compact DLLs?感谢您的帮助。

5个回答

37

通过阅读 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

这几乎帮了我 - 在我的情况下,我需要的是sqlceqp35.dll而不是sqlcecompact35.dll。 - Ivan Ičin

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


1
除此之外,sqlce4 在安装方面没有其他需要注意的地方了吧?我只需将所需的 DLL 文件复制到应用程序目录或 bin 目录中,它就可以正常工作了,对吧? - gideon
避免使用4.0.0.1版本,否则您将遇到中等信任问题。 - ErikEJ
@ErikEJ 不确定这里指的是私有部署还是一般部署,但我已经把最新的软件包添加到我的项目中,其中包括上面指定的行,而且所有的 x86 和 amd64 东西都被部署到 Bin 中。当我运行它时,它显示无法加载,并且内部异常显示根本找不到该程序集。我在这里缺少什么?(顺便说一下,版本号是4.0.0.1) - one.beat.consumer
请查看此回复:https://dev59.com/UOo6XIcBkEYKwwoYTy8d#3223450 - ErikEJ

2
谢谢你的提示 - 对我很有帮助。这里有一个SQL Server Compact-Team博客上的文章,为Sql Server Compact 3.5 SP2版本添加了一些额外的信息。
在私有部署Sql Server Compact时,我经过一番挣扎后发现还需要一些额外的要求。
我在几个不同的系统上尝试了我的应用程序,并意识到我的应用程序在其中一些系统上无法正常工作。
例如:尝试以下操作:
- 我安装了一个干净的WinXP SP3系统 - 安装了.NET Framework 4.0扩展版 - 部署了我的应用程序到新安装的系统中(包括所有必要的dll和你/Sql Server Compact团队博客文章中描述的调整) - 因此,在进行了一些研究后,我发现除了安装.NET Framework 4之外,我还需要安装.NET Framework 2,然后它就可以正常工作了。
这是我的问题:SQL Server Compact Edition使用了哪个组件,而该组件不包含在.NET Framework 4中?
我不想使我的设置过于繁琐,并将两个框架链接到我的引导程序中...有人知道任何好的提示吗?
非常感谢SQL Server Compact团队!
SQL Server Compact v3.5依赖于“Visual C++ Runtime 2005(或8.0)”(也称为CRT80)。我们在我们的MSI中打包了CRT80模块。在私有部署的情况下,您需要注意此依赖关系。在系统上使用.NET FX v2.0时,因为.NET FX v2.0还打包和安装CRT80模块,所以事情会自动处理。

感谢您提供SP2的提示。我刚刚切换到它,并且您提供的参考解决了我的问题! - David Veeneman

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的文件,您会看到它有一个<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> 节点!!! 无论哪种情况,只需从 v2 的 machine.config 文件中完全复制 <system.data> 节点到 v4 的文件中即可。

附注

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


0

卡在同一个问题上,

"在配置中找不到指定的存储提供程序或无效。"

我看到了这篇文章。 我尝试了几乎所有的方法。 我使用NuGet安装了 "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>

希望能有所帮助。 谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接