2010-03-12 53 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