0

我已经创建了一个几乎可以分发给客户的应用程序。我花了几个月的时间。一切正常,但后来我安装了 VS2012,我的所有测试都停止工作。我尝试了一切,但最终放弃并重新安装了我的整台电脑。

与以前相同的设置,但一切都很干净:Windows 7 64 位、VS2012、SQL2012 等。现在所有测试都运行良好,所以我很高兴。但现在我遇到了新的麻烦。以 SqlCe 4.0 为目标时,它不起作用。我的应用程序将通过 WinApi 与中央 SQL Server 同步。那部分很好,但是带有 SqlCe 4.0 的本地数据库不起作用。问题是什么?这是一台新的干净的电脑!

我使用基本设置创建了一个全新的解决方案:Nuget 安装了 SqlCe Compact,Entity Framework 5,代码优先,一个类,一个上下文。这没用!它卡在对数据库的第一次上下文调用中,并且没有生成数据库文件。也不例外,就是卡住了!

到底是怎么回事?SqlCe 不可靠吗?我应该切换到 SQLite 吗?问题是我有很多代码,而且我非常习惯 EF。

4

2 回答 2

2

安装 NuGet 包不会在 machine.config 中注册任何内容,您必须在自己的配置文件中删除/添加提供程序,或在用户计算机上安装 4.0 MSI 文件。EF 示例始终假定已安装 MSI。

示例配置条目:

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

我在这里有一篇关于私人部署的博客文章:http: //erikej.blogspot.dk/2011/02/using-sql-server-compact-40-with.html

于 2013-04-21T07:35:08.560 回答
0

我进行了搜索,但没有找到与我的情况完全匹配的答案。但是我在博客上得到了一个想法,提到 machine.config 文件中的格式错误。在查看它时,我发现了这个非常关键的部分:

  <system.data>
    <DbProviderFactories>
      <add name="Odbc Data Provider" invariant="System.Data.Odbc" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <add name="OleDb Data Provider" invariant="System.Data.OleDb" description=".Net Framework Data Provider for OleDb" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <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"/>
      <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.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
    </DbProviderFactories>
  </system.data>

在我的 machine.config 文件中,DbProviderFactories 部分为空。我尝试添加它但无法添加,因为它已被某个应用程序锁定。另一方面,我的客户可能会遇到同样的问题,我很难让他们编辑 machine.config。所以我用简单的方法做到了:将该部分添加到我的应用程序配置文件中!瞧!一切恢复正常。我的应用程序再次运行良好。

但为什么它在我之前的 Windows 安装中起作用?为什么这部分不总是添加到 machine.config 中?为什么在 SqlCe 4.0 和 EntityFramework 5.0 的演示示例中从未提及 DbProviderFactories 作为先决条件?这可能只是 .Net Framework 4.5 中的一个问题吗?

于 2013-04-20T21:37:22.753 回答