Как преобразовать объект DataSet в объект ObjectContext (Entity Framework) на лету? - PullRequest
3 голосов
/ 22 апреля 2010

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

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

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

Теперь, иногда мои файлы очень маленькие, и в таком случае Я быхотел бы пропустить импорт в базу данных, но просто иметь представление данных в памяти, доступное как сущности.Идея состоит в том, чтобы создать 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
            ///....

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

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

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

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

1 Ответ

1 голос
/ 30 апреля 2010

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

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

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

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

То, как мы это делаем, - это создание статического класса с помощью методов «Map»:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...