2010-03-12 2 views
3

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

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

Я пытаюсь выяснить, как открыть файл данных 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 
} 
+0

Вы когда-нибудь реализовывали вариант использования нового файла? – pomeroy

ответ

6

Вот ответ. Я упростил свой код и запустил его на более простой модели EDM, Disney Characters. Модель имеет два объекта: 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(); 
     } 
    } 
} 

Link в верхней части кода в теме форума, который я использовал для написания кода.

Вот прохождение: сначала создайте соединение с базой данных. Поскольку я использую SQL CE, у меня нет построителя строки подключения - строка подключения - это просто путь, поэтому мне он не нужен. Затем я использую EntityConnectionStringBuilder для создания строки подключения сущности, а затем использую ее для построения EntityConnection. Наконец, я передаю соединение с конструктором для моего ObjectContext. Затем я могу использовать ObjectContext для запроса EDM.

0

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

+0

На самом деле, это очень легко. См. Эту статью: http: //www.codeproject.com/KB/database/SQLCEPrivateInstallation.aspx. Я использую SQL CE с NHibernate в течение некоторого времени. –

+0

В вашем вопросе говорится: «Сейчас я просто пытаюсь открыть существующий файл данных в приложении». Какую проблему ты пытаешься решить? –

+0

Код, который я включил, не совсем работает. Я пытаюсь это исправить. –