2011-01-22 21 views
5

我想在我的WPF應用程序中使用EF代碼優先,這個想法是在AppData/MyApp中創建一個SqlCe Db(如果沒有),並將它與EF一起使用代碼第一。在WPF中使用EF代碼優先和SqlCe

當我試圖從應該創建的數據庫讀取數據時發生錯誤,但是當我檢查數據庫上下文對象時,我發現它試圖在SqlExpress中創建它。

首先,我怎樣才能將它設置爲使用CE而不是SqlExpress並設置文件位置?

我試着改變app.config中的連接字符串,但無法讓它工作(它沒有創建sdf文件),我也不知道如何設置連接字符串路徑到AppData文件夾,因爲它在用戶文件夾(不固定)。

以前從未與SqlCe或EF代碼合作​​過,因此歡迎任何幫助&讚賞。

在此先感謝。

回答

6

我已經設法讓它工作了很多搞亂之後。我的app.config具有以下內容:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    </configSections> 

    <connectionStrings> 
    <add name="Database" 
     connectionString="Data Source=Database.sdf" 
     providerName="System.Data.SqlServerCe.4.0" /> 
    </connectionStrings> 

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

</configuration> 

將DbProviderFactory放在那裏對於部署也有幫助。它將允許用戶使用SQLCE 4而無需運行安裝程序(只要您提供本地binares,一些信息在這裏:http://erikej.blogspot.com/2011/02/using-sql-server-compact-40-with.html)。

+0

前段時間我停止追逐,所以沒有測試過你的解決方案,但由於沒有人提出任何問題,而你已經有2張選票,我會接受。謝謝你,我會在某處註明解決方案,並且可能在將來使用它! – Tiax 2011-04-20 02:18:13

+0

對於代碼首先,在設置好程序後,它可以在你的開發系統上工作,app.config真正需要的就是添加`DbProviderFactories`標籤條目。 Code First爲您完成所有需要的連接字符串。 您可能還需要確保SQLCE DLL(來自Program Files [x86]文件夾)與您的程序一起分發。 – 2013-12-06 18:33:55

0

這是一個可能的線索。如果您要使用NuGet Package Manager安裝EFCodeFirst.SqlServerCompact,並查看:Visual Studio 2010 \ Projects \ MyProject \ packages \ EFCodeFirst.SqlServerCompact.0.8.8482 \ Content,它會爲您的Web應用程序執行以下操作:

public static class AppStart_SQLCEEntityFramework { 
    public static void Start() { 
     DbDatabase.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0"); 

     // Sets the default database initialization code for working with Sql Server Compact databases 
     // Uncomment this line and replace CONTEXT_NAME with the name of your DbContext if you are 
     // using your DbContext to create and manage your database 
     //DbDatabase.SetInitializer(new CreateCeDatabaseIfNotExists<CONTEXT_NAME>()); 
    } 
} 
0

我不認爲該工具已準備好用於WPF項目的SQLCE。它也阻止了我的腳步。

0

這可能不會在短期內有所幫助,但我認爲這將是長期的最佳解決方案。我一直無法找到其他人已經記錄瞭如何做到這一點,所以我想我必須在我去的時候弄清楚,除非有人更熟悉使用SqlCE4,CodeFirst和創建NuGet軟件包,否則我會跳到它。我們需要的是一個NuGet包,或者是一個新的包,或者讓現有的包足夠聰明來處理它,這可以將SqlCE4和CodeFirst添加到WPF和/或WinForms項目中。

現有的軟件包似乎面向Web項目,因爲它取決於WebActivator。從我所知道的情況來看,在非web項目上安裝WebActivator確實不合適。我不知道NuGet包是否可以檢測項目類型並根據這些信息執行不同的安裝邏輯。無論是誰負責維護EFCodeFirst.SqlServerCompact軟件包,都可以釋放非Web版本或使現有的版本變得更加智能。

等待着,在我的業餘時間,我會看看我是否能夠弄清楚如何去做,並創建自己的。我無法承諾它需要多長時間,因爲我幾乎完全處於黑暗中,無法創建NuGet包。我創建了幾個非常基本的,但從未做過任何高級的東西,如配置轉換等。