使用Entity Framework 4在运行时打开SQL CE文件

Dav*_*man 3 entity-framework sql-server-ce entity-framework-4

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

EDM非常简单.文档项目由主题列表组成,每个主题都有标题,描述和零个或多个注释.所以,我的实体是Subject,它包含Title和Text属性,Note,它有Title和Text属性.从Subject到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
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*man 6

这是答案.我简化了我的代码,并在简单的EDM模型,迪斯尼角色上运行它.模型有两个实体,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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码顶部的链接是我用来编写代码的论坛帖子.

以下是演练:首先,创建数据库连接.由于我使用的是SQL CE,因此我没有连接字符串构建器 - 连接字符串只是一个路径,所以我不需要一个.然后我用一个EntityConnectionStringBuilder构建实体连接字符串,然后用它来构建一个EntityConnection.最后,我将连接传递给我的构造函数ObjectContext.然后我可以使用它ObjectContext来查询EDM.