У меня есть существующая база данных 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: Я видел несколько вопросов об модульном тестировании, которые кажутся несколько связанными, но не совсем точными.
Automapper отлично смотрится. EF4 также замечательный, но поскольку этот проект уже очень зрелый и основан на 3.5 по требованию, в настоящее время это не вариант. Что вы подразумеваете под «отдельной процедурой» ?. Вы имеете в виду «сборку»? Также я считаю модульные тесты очень удобными, но что именно я должен проверить? Является ли отображение полным? Или изменились ли модели? Однако, наконец, я хочу поблагодарить вас за ваш ответ до сих пор! – Marcel
@Marcel, я обновил свой ответ –
Спасибо Шираз, за ответ на этот вопрос. Поскольку никто другой не ответил, и автопилот, который вы упомянули, является хорошим решением для такого рода проблем, вы получаете награду, конечно. – Marcel