Открытие файла SQL CE во время выполнения с помощью Entity Framework 4
-
19-09-2019 - |
Вопрос
Я начинаю работать с 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.