上一篇简单介绍了EF的XML模型结构,在基于xml解析一文中,主要使用xml查询技术Xpath,XQuery来得到实体模型中相应信息的,由于这种方式在数据库庞大,表关系复杂的情况下,有诸多弊端,所有使用基于元数据解析EF将更加简单便捷,适用性强。

本文主要介绍EDM元数据及其操作,实现功能与ADO.NET实体框架Entity Framework模型-基于XML解析类似,有些增强。

操作元数据一般使用以下几个步骤:

  1. 读取EDM模型
  2. 获取实体结构
  3. 获取功能结构
  4. 组织需要数据

通过API访问EDM主要通过下面三个类:

ObjectContext,EntityConnection和MetadataWorkspace。

在我的程序中主要使用左右一个MeadataWorkspace,该类的功能是暴露API以访问元数的。

DEM结果与元数据类的对应关系:

使用以下方法,可以访问XML模型中<!-- SSDL content -->下EntityType节点下的所有元数据。

var items=ctx.MetadataWorkspace.GetItems<EntityType>(DataSpace.CSpace);
在上篇文章中,对xmlhelper类更新为如下代码:
   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.Xml;
   6:  using System.Collections;
   7:  //using EF_XML_TableRelation;
   8:  using System.Data.Metadata.Edm;
   9:  using MvcApplication3.Models; 
  10:   
  11:  namespace EF_XML_TableRelation.XML
  12:  {
  13:      public class XmlHelper
  14:      {
  15:          /// <summary>
  16:          /// 获取所有表的主键
  17:          /// </summary>
  18:          /// <returns>key:表名 value:主键</returns>
  19:          public static SortedList<string, string> GetTableKEY()
  20:          {
  21:              SortedList<string, string> list = new SortedList<string, string>();
  22:              using (testEntities context = new testEntities())
  23:              {
  24:                  var entities = context.MetadataWorkspace.GetItems<EntityType>(DataSpace.CSpace);
  25:                  foreach (var item in entities)
  26:                  {
  27:                      foreach (var prop in item.Members)
  28:                      {
  29:                          var entityItem = item as EntityType;
  30:                          if (entityItem.KeyMembers.Any(p => p.Name == prop.Name))
  31:                          {
  32:                              list.Add(item.Name, prop.Name);
  33:                          }
  34:                      }
  35:                  }
  36:              }
  37:              return list;
  38:          }
  39:          /// <summary>
  40:          /// 获取表的关系
  41:          /// </summary>
  42:          /// <param name="tablename"></param>
  43:          /// <param name="IsRelation"></param>
  44:          /// <returns></returns>
  45:          public static List<TableRelation> GetTable(string tablename, bool IsRelation)
  46:          {
  47:              List<TableRelation> list = new List<TableRelation>();
  48:              using (testEntities context = new testEntities())
  49:              {
  50:                  var entities = context.MetadataWorkspace.GetItems<EntityType>(DataSpace.CSpace);
  51:                  EntityType entityItem = null;
  52:                  if (IsRelation)
  53:                  {
  54:                      foreach (var item in entities)
  55:                      {
  56:                          if (entityItem == null)
  57:                          {
  58:                              entityItem = item as EntityType;
  59:                          }
  60:                          if (entityItem.NavigationProperties.Contains(item.Name) || item.Name.Equals(tablename))
  61:                              list.Add(WriteProperties(item, context, DataSpace.CSpace));
  62:                      }
  63:                  }
  64:                  else
  65:                  {
  66:                      foreach (var item in entities)
  67:                      {
  68:                          if (entityItem == null)
  69:                          {
  70:                              entityItem = item as EntityType;
  71:                          }
  72:                          if (item.Name.Equals(tablename))
  73:                              list.Add(WriteProperties(item, context, DataSpace.CSpace));
  74:                      }
  75:                  }
  76:              }
  77:              return list;
  78:          }
  79:          /// <summary>
  80:          /// 表的关系合集
  81:          /// </summary>
  82:          /// <param name="item"></param>
  83:          /// <param name="ctx"></param>
  84:          /// <param name="space"></param>
  85:          /// <returns></returns>
  86:          public static TableRelation WriteProperties(StructuralType item, testEntities ctx, DataSpace space)
  87:          {
  88:              TableRelation tr = new TableRelation();
  89:              var node = (space == DataSpace.CSpace) ? "Properties" : "Columns";
  90:              List<Column> list = new List<Column>(); 
  91:   
  92:              foreach (var prop in item.Members)
  93:              {
  94:                  var entityItem = item as EntityType;
  95:                  Column column = new Column(); 
  96:   
  97:                  if (entityItem != null && entityItem.Properties.Contains(prop))
  98:                  {
  99:                      column.columnname = prop.Name;
 100:                      column.title = prop.Documentation != null ? prop.Documentation.Summary : null;
 101:                      column.type = prop.TypeUsage.EdmType != null ? prop.TypeUsage.EdmType.Name : null;
 102:                      column.maxlength = prop.TypeUsage.Facets.Contains("MaxLength") ? prop.TypeUsage.Facets["MaxLength"].Value.ToString() : null;
 103:                      if (ctx.MetadataWorkspace
 104:                        .GetItems<AssociationType>(space)
 105:                          .Where(a => a.IsForeignKey).Any(a =>
 106:                            a.ReferentialConstraints[0]
 107:                             .ToProperties[0].Name == prop.Name &&
 108:                            a.ReferentialConstraints[0].ToRole.Name.Contains(item.Name)))
 109:                      {
 110:                          for (int i = 0; i < Realation(item, ctx, DataSpace.CSpace).Count; i++)
 111:                          {
 112:                              if (Realation(item, ctx, DataSpace.CSpace).Values[i].Values[0].Equals(prop.Name) &&
 113:                                 Realation(item, ctx, DataSpace.CSpace).Values[i].Values[2].Contains(item.Name))
 114:                              { 
 115:   
 116:                                  column.mainrole = Realation(item, ctx, DataSpace.CSpace).Values[i].Values[6].ToString();
 117:                                  column.mainmultiplicity = Realation(item, ctx, DataSpace.CSpace).Values[i].Values[5].ToString();
 118:                                  column.mainkey = Realation(item, ctx, DataSpace.CSpace).Values[i].Values[4].ToString();
 119:                                  column.relationname = Realation(item, ctx, DataSpace.CSpace).Values[i].Values[3].ToString(); 
 120:   
 121:                              } 
 122:   
 123:                          }
 124:                      }
 125:                      list.Add(column);
 126:                  }
 127:                  tr.tablename = item.Name;
 128:                  tr.tabletitle = item.Documentation != null ? item.Documentation.Summary : item.Name;
 129:                  tr.columns = list;
 130:              }
 131:              return tr;
 132:          }
 133:          /// <summary>
 134:          /// 返回所有主表的关系
 135:          /// </summary>
 136:          /// <param name="item"></param>
 137:          /// <param name="ctx"></param>
 138:          /// <param name="space"></param>
 139:          /// <returns></returns>
 140:          public static SortedList<string, SortedList<string, string>> Realation(StructuralType item, testEntities ctx, DataSpace space)
 141:          {
 142:              SortedList<string, SortedList<string, string>> list1 = new SortedList<string, SortedList<string, string>>();
 143:              var entity = ctx.MetadataWorkspace.GetItems<AssociationType>(space);
 144:              foreach (var a in entity)
 145:              {
 146:                  var entityItem = item as EntityType;
 147:                  for (int i = 0; i < entityItem.NavigationProperties.Count; i++)
 148:                  {
 149:                      if (entityItem.NavigationProperties[i].RelationshipType.Name.Equals(a.Name))
 150:                      {
 151:                          SortedList<string, string> list = new SortedList<string, string>();
 152:                          list.Add("mainrole", a.ReferentialConstraints[0].ToRole.Name);
 153:                          list.Add("mainkey", a.ReferentialConstraints[0].ToProperties[0].Name);
 154:                          list.Add("mainmultiplicity", a.ReferentialConstraints[0].ToRole.RelationshipMultiplicity.ToString());
 155:                          list.Add("subrole", a.ReferentialConstraints[0].FromRole.Name);
 156:                          list.Add("subkey", a.ReferentialConstraints[0].FromProperties[0].Name);
 157:                          list.Add("submultiplicity", a.ReferentialConstraints[0].FromRole.RelationshipMultiplicity.ToString());
 158:                          list.Add("relationname", a.Name);
 159:                          if (!list1.ContainsKey(a.Name))
 160:                          {
 161:                              list1.Add(a.Name, list);
 162:                          }
 163:                      }
 164:                  }
 165:              }
 166:              return list1;
 167:          }
 168:      }
 169:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

以上为使用元数据方式查询EF框架的信息属性等。

ADO.NET实体框架Entity Framework模型-基于元数据解析的更多相关文章

  1. ADO.NET实体框架Entity Framework模型-基于XML解析

            最近由于项目需求,需要对实体框架内表之间的关系进行处理,主要功能要求是通过一表名,返回其在实体框架内的所有关系表.主外键及每个字段的属性.先简单描述我解决这个问题从开始到最后的分析实现 ...

  2. 实体框架(Entity Framework)快速入门

    实体 框架 (Entity Framework )简介 实体框架Entity Framework 是 ADO .NET 中的一组支持 开发 面向数据的软件应用程序的技术.是微软的一个ORM框架. OR ...

  3. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

    转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...

  4. 实体框架(Entity Framework)快速入门--实例篇

    在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...

  5. 实体框架Entity Framework 4.1快速入门

    介 绍 在旧的Entity 框架中,开发者可以从已存在的数据库中产生业务实体的模型,这种开发方法被称为数据库驱动的开发方法.而在4.1的Entity Framework中,支开发者先创建实体业务类,然 ...

  6. 实体框架—Entity Framework

    简称EF,是微软以ADO.NET为基础所发展出来的对象关系对应(ORM)解决方案. EF就是用来处理数据的,与数据库打交道.但是底层还是用到了ADO.NET的那一套东西. 为什么叫对象关系对应解决方案 ...

  7. Entity Framework 学习总结之一:ADO.NET 实体框架概述

    http://www.cnblogs.com/xlovey/archive/2011/01/03/1924800.html ADO.NET 实体框架概述 新版本中的 ADO.NET 以新实体框架为特色 ...

  8. [转] ADO.NET实体框架引发争论

    转自:http://developer.51cto.com/art/200811/76356.htm 2008-11-11 14:00 朱永光译 infoq 我要评论(0) 一个在ADO.NET实体框 ...

  9. ORM框架Entity Framework

    博客园在推广ORM方面的确做了很大的贡献,很多的程序员开始使用ORM,不用写SQL的喜悦让他们激动不已,可是好景不长,他们很快发现众多的烦恼一个接一个的出现了. 很遗憾,我并不打算在这篇文章中解决这些 ...

随机推荐

  1. Server Objects Extension(SOE)开发(三)

    前言 SOE出现之前,一些复杂.耗时的gis操作,通常都是使用gp服务实现的.前面将gp服务和soe进行了对比分析,为了测试两种的效率,曾经做了个demo,使用soe和gp同时执行相同的业务逻辑,记录 ...

  2. Navicat for MySQL远程连接虚拟机

    在虚拟机中进入mysql mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT O ...

  3. 通过jdt解析spring mvc中url-类-方法的对应关系

    依赖 <dependencies> <dependency> <groupId>org.eclipse.jdt</groupId> <artifa ...

  4. scrapy+mongodb报错 TypeError: name must be an instance of str

    经过各种排查,最后找到原因,在settings文件中配置文件大小写写错了,在pipelines中 mongo_db=crawler.settings.get('MONGODB_DB'),get 获取的 ...

  5. 001-maven下载jar后缀为lastUpdated问题

    问题简述 Maven在下载仓库中找不到相应资源时,网络中断等,会生成一个.lastUpdated为后缀的文件.如果这个文件存在,那么即使换一个有资源的仓库后,Maven依然不会去下载新资源. 解决方案 ...

  6. 20170405-STO库存转储单

    1.工厂间转储: (1)MB1B 移动类型 301 工厂到工厂(一步)转账,->简单明了一步转储过账后会产生 GR,MITA增加了,MIZH减少了,MB03, **会产生 GR,如果俩工厂 标准 ...

  7. payload有效载荷(转)

    payload 记载着信息的那部分数据.通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如这一批数据量的大小,校验位等,这样就相当于给已经 ...

  8. Vim 指令一览表

    vim 程序编辑器 移动光标的方法 h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移动一个字符 k 或 向上箭头键(↑) 光标向上移动一个字符 l 或 向右箭头键( ...

  9. ANSI编码——代码页

    详见wiki: http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E9%A1%B5

  10. pdo封装2

    <?php //添加了一个 _createSql 方法,负责创建所有sql class Db{ static private $ins; private $pdo; private $table ...