2013-04-20 65 views
0

我創建了一個幾乎可以分發給客戶端的應用程序。我花了幾個月的時間。一切正常,但後來我安裝了VS2012,我的所有測試都停止了。我嘗試了一切,但最終放棄並重新安裝了我的整個計算機。SqlCe 4.0 + EF 5.0在VS2012中停止工作

與以前相同的設置,但一切都很乾淨:Windows 7 64bit,VS2012,SQL2012等。現在所有測試都正常工作,所以我很高興。但現在我遇到了新的麻煩。當定位SqlCe 4.0時,它不起作用。我的應用程序將通過WinApi與中央SQL Server同步。這部分很好,但SqlCe 4.0本地數據庫不起作用。問題是什麼?這是一臺新的乾淨的電腦!

我創建了一個全新的基本設置解決方案:Nuget安裝了SqlCe Compact,實體框架5,代碼優先,一個類,一個上下文。這是行不通的!它被卡在第一個上下文調用數據庫和數據庫文件沒有生成。沒有例外,只是卡住了!

這是怎麼回事? SqlCe不可靠嗎?我應該切換到SQLite嗎?問題是我有很多代碼,我非常習慣EF。

回答

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中的一個問題?

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> 

我有私人deplyment這裏博客文章:http://erikej.blogspot.dk/2011/02/using-sql-server-compact-40-with.html

+0

謝謝,我一定會擁有該建議使用。但爲什麼這麼複雜? SqlCe 4不適合客戶端安裝嗎?它不應該與ClickOnce一起使用嗎?或者我錯過了什麼?我知道微軟現在推薦SqlLocalDb,但我真的很喜歡基於文件的簡單數據庫的想法,可以很容易地移動。對於我的目的(〜1Mb),尺寸和速度非常好。我只是假設SqlCe 4將是最好的。 SqlLocalDb或SqlCe 3.5更容易部署爲客戶端數據庫嗎? – 2013-04-22 20:44:54

+0

SQL CE 4是最容易部署的,並且可以與EF5一起工作 – ErikEJ 2013-04-23 14:06:06