我已经创建了一个几乎准备好分发给客户的应用程序。我花了几个月的时间。一切正常,但后来我安装了VS2012,我的所有测试都停止了。我尝试了一切,但终于放弃了并重新安装了我的整台电脑。
与以前相同的设置,但一切都干净:Windows 7 64位,VS2012,SQL2012等。现在所有的测试工作正常,所以我很高兴。但现在我遇到了一个新的麻烦。当针对SqlCe 4.0时,它不起作用。我的应用程序将通过WinApi与中央SQL Server同步。那部分很好,但是使用SqlCe 4.0的本地数据库不起作用。问题是什么?这是一台新的干净的电脑!
我使用基本设置创建了一个全新的解决方案:Nuget安装了SqlCe Compact,Entity Framework 5,代码优先,一个类,一个上下文。这是行不通的!它停留在对数据库的第一个上下文调用中,并且不生成数据库文件。没有例外,只是卡住了!
发生了什么事? SqlCe不可靠吗?我应该切换到SQLite吗?问题是我有很多代码,我很习惯EF。
答案 0 :(得分: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
答案 1 :(得分: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中?为什么DbProviderFactories从未作为SqlCe 4.0上的演示示例与EntityFramework 5.0结合使用的先决条件提及?这可能只是.Net Framework 4.5中的一个问题吗?