Открытие файла SQL CE во время выполнения с помощью Entity Framework 4

StackOverflow https://stackoverflow.com/questions/2433934

Вопрос

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

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

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

Я воспроизвел свой существующий код "Открыть файл" ниже.Я настроил его как статический сервисный класс, называемый Файловые сервисы.Код пока работает не совсем, но его достаточно, чтобы показать, что я пытаюсь сделать.Я пытаюсь сохранить ObjectContext открытым для обновлений объекта entity, удаляя его при закрытии файла.

Итак, вот мой вопрос:На правильном ли я пути?Что мне нужно изменить, чтобы заставить этот код работать с 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
}
Это было полезно?

Решение

Вот и весь ответ.Я упростил свой код и запустил его на более простой модели 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.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top