3

我开始使用 Entity Framework 4,并创建一个演示应用程序作为学习练习。该应用程序是一个简单的文档生成器,它使用 SQL CE 存储。每个文档项目都有自己的 SQL CE 数据文件,用户打开其中一个文件来处理项目。

EDM 非常简单。一个文档项目由一个主题列表组成,每个主题都有一个标题、一个描述和零个或多个注释。因此,我的实体是包含 Title 和 Text 属性的 Subject 和具有 Title 和 Text 属性的 Note。从主题到注释存在一对多关联。

我想弄清楚如何打开 SQL CE 数据文件。数据文件必须与 EF4 的创建数据库向导创建的 SQL CE 数据库的架构相匹配,我将在应用程序的其他地方实现一个新文件用例来实现该要求。现在,我只是想在应用程序中打开现有的数据文件。

我在下面复制了我现有的“打开文件”代码。我已将其设置为名为File Services的静态服务类。该代码尚未完全正常工作,但足以显示我正在尝试做的事情。我试图保持 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
}
4

2 回答 2

6

这是答案。我简化了我的代码并在更简单的 EDM 模型Disney Characters上运行它。模型有两个实体Character和,在和Child之间具有 1:* 关联。孩子是角色的孩子——很简单的东西。我将演示编写为控制台应用程序,以使其尽可能简单。CharacterChild

中的完整代码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。

于 2010-03-13T20:46:37.350 回答
0

由于某些奇怪的原因,查找/打开 SQL Server CE 数据库很难。在尝试使其与 EF 一起使用之前,请确保您可以与数据库建立任何类型的连接。

于 2010-03-12T16:18:55.040 回答