2010-03-12 58 views
3

我開始使用實體框架4,並創建演示應用程序作爲學習練習。該應用程序是一個簡單的文檔生成器,它使用SQL CE存儲。每個文檔項目都有自己的SQL CE數據文件,用戶可以打開其中一個文件來處理項目。使用實體框架在運行時打開SQL CE文件4

EDM非常簡單。文檔項目由一系列主題組成,每個主題都有一個標題,一個描述以及零個或多個註釋。所以,我的實體是包含標題和文本屬性的主題,以及具有標題和文本屬性的註釋。從主題到註釋之間存在一對多關聯。

我想弄清楚如何打開一個SQL CE數據文件。數據文件必須與由EF4的創建數據庫嚮導創建的SQL CE數據庫的模式相匹配,並且我將在應用程序的其他地方實施新文件用例來實現該要求。現在,我只是試圖在應用程序中打開現有的數據文件。

我已經在下面複製了我現有的「打開文件」代碼。我已將其設置爲靜態服務類,名爲文件服務。代碼還沒有正常工作,但足以顯示我正在嘗試做什麼。我試圖保持ObjectContext爲實體對象更新而打開,在文件關閉時進行處理。

所以,這是我的問題:我在正確的軌道上?我需要改變這個代碼以適應EF4嗎?有沒有一個如何正確地做到這一點的例子?

感謝您的幫助。

我的現有代碼:

public static class FileServices 
{ 
    #region Private Fields 

    // Member variables 
    private static EntityConnection m_EntityConnection; 
    private static ObjectContext m_ObjectContext; 

    #endregion 

    #region Service Methods 

    /// <summary> 
    /// Opens an SQL CE database file. 
    /// </summary> 
    /// <param name="filePath">The path to the SQL CE file to open.</param> 
    /// <param name="viewModel">The main window view model.</param> 
    public static void OpenSqlCeFile(string filePath, MainWindowViewModel viewModel) 
    { 
     // Configure an SQL CE connection string 
     var sqlCeConnectionString = string.Format("Data Source={0}", filePath); 

     // Configure an EDM connection string 
     var builder = new EntityConnectionStringBuilder(); 
     builder.Metadata = "res://*/EF4Model.csdl|res://*/EF4Model.ssdl|res://*/EF4Model.msl"; 
     builder.Provider = "System.Data.SqlServerCe"; 
     builder.ProviderConnectionString = sqlCeConnectionString; 
     var entityConnectionString = builder.ToString(); 

     // Connect to the model 
     m_EntityConnection = new EntityConnection(entityConnectionString); 
     m_EntityConnection.Open(); 

     // Create an object context 
     m_ObjectContext = new Model1Container(); 

     // Get all Subject data 
     IQueryable<Subject> subjects = from s in Subjects orderby s.Title select s; 

     // Set view model data property 
     viewModel.Subjects = new ObservableCollection<Subject>(subjects); 
    } 

    /// <summary> 
    /// Closes an SQL CE database file. 
    /// </summary> 
    public static void CloseSqlCeFile() 
    { 
     m_EntityConnection.Close(); 
     m_ObjectContext.Dispose(); 
    } 

    #endregion 
} 
+0

你有沒有實現新的文件用例? – pomeroy 2011-02-07 21:47:27

回答

6

下面是答案。我簡化了我的代碼,並在簡單的EDM模型上運行它,迪士尼角色。模型有兩個實體,CharacterChild,在CharacterChild之間具有1:*關聯。孩子是人物的孩子 - 非常簡單的東西。我將演示作爲控制檯應用程序編寫,以儘可能簡化它。

完整代碼在Program.cs如下:在代碼的頂部

class Program 
{ 
    static void Main(string[] args) 
    { 
     /* See http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/8a89a728-6c8d-4734-98cb-11b196ba11fd */ 

     // Configure an SQL CE connection string 
     var filePath = @"D:\Users\dcveeneman\Documents\Visual Studio 2010\Demos\SqlCeEf4Demo\SqlCeEf4Demo\DisneyChars.sdf"; 
     var sqlCeConnectionString = string.Format("Data Source={0}", filePath); 

     // Create an EDM connection 
     var builder = new EntityConnectionStringBuilder(); 
     builder.Metadata = "res://*/DisneyChars.csdl|res://*/DisneyChars.ssdl|res://*/DisneyChars.msl"; 
     builder.Provider = "System.Data.SqlServerCe.3.5"; 
     builder.ProviderConnectionString = sqlCeConnectionString; 
     var edmConnectionString = builder.ToString(); 
     var edmConnection = new EntityConnection(edmConnectionString); 

     // Build and query an ObjectContext 
     using (var context = new DisneyCharsContainer(edmConnection)) 
     { 
      var chars = context.Characters; 
      foreach(var character in chars) 
      { 
       Console.WriteLine("Character name: {0}", character.Name); 
       foreach(var child in character.Children) 
       { 
        Console.WriteLine("Child name: {0}", child.Name); 
       } 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

鏈接是一個論壇主題,我以前寫的代碼。

這裏是演練:首先,創建一個數據庫連接。由於我使用的是SQL CE,因此我沒有連接字符串構建器 - 連接字符串只是一個路徑,所以我不需要一個。然後我使用EntityConnectionStringBuilder來構建一個實體連接字符串,然後我用它來構建一個EntityConnection。最後,我將連接傳遞給我的ObjectContext的構造函數。然後我可以使用ObjectContext來查詢EDM。

0

查找/打開SQL Server CE數據庫,對於一些奇怪的原因,hard to do。確保在嘗試使用EF來連接數據庫之前,可以進行任何類型的連接。

+0

其實,這很容易。看到這篇文章:http://www.codeproject.com/KB/database/SQLCEPrivateInstallation.aspx。我一直在使用SQL CE和NHibernate很長一段時間。 – 2010-03-12 18:20:51

+0

你的問題說:「現在,我只是試圖讓現有的數據文件在應用程序中打開。」你想解決什麼問題? – 2010-03-12 18:52:35

+0

我包含的代碼並不完美。我正在嘗試修復它。 – 2010-03-12 21:04:40