2010-04-22 1 views
3

У меня есть существующая база данных SQL Server, где хранятся данные из больших файлов журнала (часто 100 МБ и более), по одному на базу данных. После некоторого анализа база данных снова удаляется.Как преобразовать объект DataSet в объект ObjectContext (Entity Framework) на лету?

Из базы данных я создал конструкцию модели Entity и модель DataSet с помощью дизайнеров Visual Studio. DataSet предназначен для массового импорта данных с SqlBulkCopy после довольно сложного процесса синтаксического анализа. Все запросы затем осуществляется с помощью Entity Framework модели, чей CreateQuery метод подвергается через интерфейс, как этот

public IQueryable<TTarget> GetResults<TTarget>() where TTarget : EntityObject, new() 
    { 
     return this.Context.CreateQuery<TTarget>(typeof(TTarget).Name); 
    } 

Теперь, иногда мои файлы очень малы, и в таком случае я хотел бы опустить импорт в базы данных, но просто иметь представление в памяти данных, доступное как Entities. Идея состоит в том, чтобы создать DataSet, но вместо массового импорта напрямую передать его в ObjectContext, доступный через интерфейс.

Имеет ли это смысл?

Теперь вот что я сделал для этого преобразования: я перемещаю все таблицы в DataSet, преобразовываю одиночные строки в сущности соответствующего типа и добавляю их к экземпляру объекта моего типизированного класса контекста Entity, например

  MyEntities context = new MyEntities(); //create new in-memory context 
      ///.... 
      //get the item in the navigations table 
      MyDataSet.NavigationResultRow dataRow = ds.NavigationResult.First(); //here, a foreach would be necessary in a true-world scenario 
      NavigationResult entity = new NavigationResult 
      { 
       Direction = dataRow.Direction, 
       ///... 
       NavigationResultID = dataRow.NavigationResultID 
      }; //convert to entities 

      context.AddToNavigationResult(entity); //add to entities 
      ///.... 

Очень утомительная работа, так как мне нужно будет создать конвертер для каждого из моих сущностей и перебрать каждую таблицу в DataSet, который у меня есть. Опасайтесь, если я когда-либо изменю мою модель базы данных ....

Кроме того, я выяснил, что я могу только создать экземпляр MyEntities, если я предоставляю правильную строку подключения в базу данных SQL Server. Поскольку я не хочу писать в свою полноценную базу данных каждый раз, это мешает моим намерениям. Я намерен иметь только некоторую базу данных прокси-памяти в памяти.

Могу ли я сделать проще? Есть ли какой-то автоматический способ сделать такое преобразование, например, создание объекта ObjectContext из объекта DataSet?

P.S: Я видел несколько вопросов об модульном тестировании, которые кажутся несколько связанными, но не совсем точными.

ответ

1

Есть инструменты, которые отображают между объектами, такими как automapper. Это очень хороший инструмент с открытым исходным кодом.

Однако эти инструменты иногда имеют проблемы, например, генерирование повторяющихся сущностей сущностей или проблемы, когда структура отображаемых объектов очень различна.

Если вы пытаетесь автоматизировать его, я думаю, что есть большая вероятность его работы, если вы используете объекты EF 4 и POCO.

Если вы закончите писать код сопоставления вручную, я бы переместил его в отдельную процедуру с автоматическими модульными тестами на нем.

, как мы делаем это, чтобы создать статический класс с "Map" методы ":

  • От DTO до объекта EF
  • От EF в DTO

Затем написать тест для каждого метода, в котором мы проверяем правильность отображения полей.

+0

Automapper отлично смотрится. EF4 также замечательный, но поскольку этот проект уже очень зрелый и основан на 3.5 по требованию, в настоящее время это не вариант. Что вы подразумеваете под «отдельной процедурой» ?. Вы имеете в виду «сборку»? Также я считаю модульные тесты очень удобными, но что именно я должен проверить? Является ли отображение полным? Или изменились ли модели? Однако, наконец, я хочу поблагодарить вас за ваш ответ до сих пор! – Marcel

+0

@Marcel, я обновил свой ответ –

+0

Спасибо Шираз, за ​​ответ на этот вопрос. Поскольку никто другой не ответил, и автопилот, который вы упомянули, является хорошим решением для такого рода проблем, вы получаете награду, конечно. – Marcel

Смежные вопросы