【问题标题】:Using Entity Framework with an SQL Compact Private Installation将实体框架与 SQL Compact 私有安装一起使用
【发布时间】:2011-02-02 04:53:26
【问题描述】:

我在带有 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 的任何其他建议?感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    遇到同样的问题,

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

    我是通过这篇文章来的。 我几乎尝试了一切。 我已经使用 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>
    

    希望对你有帮助.. 谢谢。

    【讨论】:

      【解决方案2】:

      这对我有用:

      您已获得 dotNet 2.0 和 4.0 版的 machine.config 文件:

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

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

      旁注

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

      【讨论】:

        【解决方案3】:

        仅作记录,对于 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 在一般部署的情况下。

        【讨论】:

        • 但除此之外 sqlce4 在安装方面没有任何其他功能吗?我可以将所需的 dll 复制到应用程序目录或 bin 中,它应该可以正常工作吗?
        • 避免使用 4.0.0.1 版本,否则会遇到中等信任问题
        • @ErikEJ 不确定这里是什么意思 Private vs. General deployment,但我已经将最新的包添加到我的项目中,它包括上面指定的行,并且部署了所有 x86 和 amd64 的东西给斌。当我运行它时,它说它无法加载,而内部异常说它根本找不到程序集。我在这里想念什么? (4.0.0.1 顺便说一句)
        【解决方案4】:

        感谢您的提示 - 对我帮助很大。 有一个 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 compact 团队博客文章中描述的所有必要的 dll 和调整)

        所以,经过一番研究,我发现除了安装 .net framework 4 之外,我还必须安装 .net framework 2,它运行良好。

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

        我不想让我的设置过载并将两个框架链接到我的引导程序... 有人知道什么好的Tip吗?

        非常感谢 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。

        谢谢

        【讨论】:

        【解决方案5】:

        感谢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) 在Setup项目中,将以下文件添加到文件系统编辑器的Application文件夹中:

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

        【讨论】:

        • 这几乎帮了我 - 在我的情况下,我需要 sqlceqp35.dll 而不是 sqlcecompact35.dll
        猜你喜欢
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        相关资源
        最近更新 更多