Экспорт в XML с сайта динамических данных - PullRequest
6 голосов
/ 27 июня 2011

Мне нужно обновить существующий сайт, основанный на DDS, поверх Entity Framework, и он использует три разные модели баз данных из трех разных баз данных.И для этого нужно простое дополнение к странице ListDetails: кнопка экспорта в XML ...
Добавить кнопку легко.Создание XML тоже не сложно.Задача состоит в том, чтобы получить правильную таблицу для экспорта, просмотреть все записи и поля и сгенерировать XML на основе любой из 100+ таблиц в системе!
Итак, моя кнопка вызывает обработчик экспорта (ashx), который генерирует XMLна основе таблицы, чье имя он получает через свои параметры.Код, который у меня есть, выглядит примерно так:

        Content_CobaEntities Coba = new Content_CobaEntities();
        MetadataWorkspace metadataWorkspace = Coba.MetadataWorkspace;
        EntityContainer container = metadataWorkspace.GetItems<EntityContainer>(DataSpace.CSpace).First();
        string namespaceName = metadataWorkspace.GetItems<EntityType>(DataSpace.CSpace).First().NamespaceName;
        EntitySetBase entitySetBase = container.BaseEntitySets.FirstOrDefault(set => set.ElementType.Name == Entity);

К сожалению, это работает только с одним контекстом, а у меня три.(Но этот является основным контекстом.) (Кроме того, второй параметр может использоваться для определения правильного контекста.) И хотя он позволяет мне определить необходимый тип сущности, он все равно не предоставит мне доступ к его записям.и поля.

Итак, как мне получить данные для этой сущности?(Фильтры не важны; экспорт вернет все данные.)

И нет, EF4 нет.Нет .NET 4. Это более старый проект VS2008, и его нельзя много изменить, и его нельзя обновить ...


По сути, строка запроса содержит два параметра: ContextID и QueryID.ContextID сообщает мне, какой контекст использовать, и так как у меня есть только три различных контекста, простая команда switch решает это для меня.Но один из контекстов содержит более 60 запросов, каждый из которых связан с одной таблицей базы данных.Сайт динамических данных предоставляет мне возможность добавлять, редактировать и удалять записи из этой таблицы, но его необходимо экспортировать в формате, определяемом моим пользовательским кодом.Но с 60 таблицами слишком сложно написать оператор switch для каждого запроса, поэтому мне нужно что-то более общее.

1 Ответ

2 голосов
/ 30 июня 2011

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

        string Entity = context.Request.QueryString.Get("Entity");
        string ContextID = context.Request.QueryString.Get("Context");

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

        ObjectContext Context;
        if (ContextID.Contains("Content_LogEntities")) { Context = new Content_LogEntities(); }
        else if (ContextID.Contains("Content_CobusEntities")) { Context = new Content_CobusEntities(); }
        else { Context = new Content_CobaEntities(); };

Далее мне нужно получить правильные данные в запрошенной таблице. Также легко:

        ObjectQuery Tabel = Context.CreateQuery<EntityObject>(string.Format("[{0}]", Entity));

Не знаю, почему я пытался сделать эту часть более сложной, чем нужно.

Осталось пройтись по всем полям, но у меня есть рефлексия:

        foreach (var rec in Tabel)
        {
            foreach (PropertyInfo Prop in rec.GetType().GetProperties())
            {
                // Blah
            }
        }

Часть Blah проверяет имя Prop.Name, чтобы узнать, является ли он ключом сущности, состоянием сущности, дочерней коллекцией или ссылкой, или же это просто поле данных. Это позволяет мне генерировать практический вывод XML.

...