Открытие файла SQL CE во время выполнения с Entity Framework 4 - PullRequest
3 голосов
/ 12 марта 2010

Я начинаю работать с Entity Framework 4 и создаю демонстрационное приложение в качестве учебного упражнения. Приложение представляет собой простой конструктор документации и использует хранилище SQL CE. Каждый проект документации имеет свой собственный файл данных SQL CE, и пользователь открывает один из этих файлов для работы над проектом.

EDM очень прост. Проект документации состоит из списка предметов, каждый из которых имеет заголовок, описание и ноль или более примечаний. Итак, мои объекты - это Subject, который содержит свойства Title и Text, и Note, который имеет свойства Title и Text. Существует связь «один-ко-многим» от предмета к примечанию.

Я пытаюсь выяснить, как открыть файл данных SQL CE. Файл данных должен соответствовать схеме базы данных SQL CE, созданной мастером создания базы данных EF4, и я реализую вариант использования нового файла в другом месте приложения, чтобы реализовать это требование. Сейчас я просто пытаюсь открыть существующий файл данных в приложении.

Я воспроизвел свой существующий код «Открыть файл» ниже. Я настроил его как статический класс обслуживания с именем Файловые службы . Код пока не работает, но этого достаточно, чтобы показать, что я пытаюсь сделать. Я пытаюсь держать 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
}

Ответы [ 2 ]

6 голосов
/ 13 марта 2010

Вот ответ. Я упростил свой код и запустил его на более простой модели EDM, Символы Диснея . Модель имеет две сущности, Character и Child, с ассоциацией 1: * между Character и Child. Дети - это дети персонажей - довольно простые вещи. Я написал демо как консольное приложение, чтобы сделать его максимально простым.

Полный код в 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 голосов
/ 12 марта 2010

Поиск / открытие базы данных SQL Server CE по какой-то странной причине трудно сделать . Прежде чем пытаться заставить его работать с EF, убедитесь, что вы можете установить любой тип соединения с БД.

...