从动态数据站点导出到XML

Wim*_*ink 6 .net entity-framework dynamic-data visual-studio-2008-sp1

我必须在实体框架之上更新基于DDS的现有站点,并且它使用来自三个不同数据库的三种不同的数据库模型.它需要的是对ListDetails页面的简单添加:导出到XML按钮...
添加按钮很简单.创建XML也不困难.挑战在于获取适当的表格以进行导出,遍历所有记录和字段,并基于系统中的任何100个表格生成XML!
因此,我的按钮调用一个导出(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);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仅适用于单个上下文,而我碰巧有三个.(但这个是主要的上下文.)(此外,第二个参数可用于确定正确的上下文.)虽然它允许我确定所需的实体类型,但它仍然不会让我访问它的记录和领域.

那么,如何获取该实体的数据?(过滤器不重要;导出将返回所有数据.)

不,没有EF4.没有.NET 4.这是一个较旧的VS2008项目,无法修改太多,也无法升级......


基本上,查询字符串包含两个参数:ContextID和QueryID.ContextID告诉我使用哪个上下文,因为我只有三个不同的上下文,一个简单的switch-command为我解决了这个问题.但其中一个上下文包含60多个查询,每个查询都与一个数据库表相关.动态数据站点为我提供了添加,编辑和删除此表中记录的选项,但需要以我的自定义代码指定的格式导出.但是对于60个表,为每个查询编写一个switch语句太多了所以我需要更通用的东西.

Wim*_*ink 2

事实证明,我让事情变得比需要的更复杂......我从参数开始:

        string Entity = context.Request.QueryString.Get("Entity");
        string ContextID = context.Request.QueryString.Get("Context");
Run Code Online (Sandbox Code Playgroud)

然后我需要确定要使用的正确上下文,这很简单:

        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(); };
Run Code Online (Sandbox Code Playgroud)

接下来我需要在请求的表中获取正确的数据。也很简单:

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

不知道为什么我试图使该部分比需要的更复杂。

剩下的就是遍历所有领域,但我有一个反思解决方法:

        foreach (var rec in Tabel)
        {
            foreach (PropertyInfo Prop in rec.GetType().GetProperties())
            {
                // Blah
            }
        }
Run Code Online (Sandbox Code Playgroud)

Blah 部分检查 Prop.Name 以查看它是否是实体键、实体状态、子集合或引用,或者它是否只是一个数据字段。这使我能够生成实用的 XML 输出。