上一篇简单介绍了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:  }

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

转载于:https://www.cnblogs.com/jiangxin/p/3190603.html

ADO.NET实体框架Entity Framework模型-基于元数据解析相关推荐

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

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

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

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

  3. 实体框架(Entity Framework)简介

    实体框架(Entity Framework)简介 实体框架(Entity Framework)简介 简称EF,与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO. ...

  4. ADO.NET Entity Framework 入门示例向导(附Demo程序下载)

    ADO.NET Entity Framework 入门示例向导(附Demo程序下载) ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架, ...

  5. ORM框架 之 Entity Framework

    Entity Framework 1.ADO.NET Entity Framework是以ADO.NET为基础所发展出来的对象关系对应(O/R Mapping)解决方案,早起被称为ObjectSpac ...

  6. ADO.NET Entity Framework 入门示例

    ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架,它使开发人员可以通过对象模型(而不是逻辑/关系数据模型)专注于数据.实体框架Entit ...

  7. ADO.NET Entity Framework 基本概述

    时间过得很快转眼间VS已经2010版了,在4月12日将会正式发布VS 2010 ADOEF 做为.Net 4.0 中被微软推荐的ORM框架,相比.Net 3.5 sp1 已经得到了进一步的增强,使用它 ...

  8. sql注入pythonpoco_.NET EF(Entity Framework)详解

    一丶Entity Framework (一)EF简介 (1)ORM:Object Relation Mapping ,通俗说:用操作对象的方式来操作数据库. (2)插入数据库不再是执行Insert,而 ...

  9. NHibernate与EF(Entity Framework)的区别

    概述 长久以来,程序员和数据库总是保持着一种微妙的关系,在商用应用程序中,数据库一定是不可或缺的元件,这让程序员一定要为了连接与访问数据库而去学习 SQL 指令,至少对于我而言,我觉得这是一个很不爽的 ...

  10. Entity Framework ---初见

    在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品.用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储 ...

最新文章

  1. 一手好 SQL 是如何炼成的?
  2. Python 存储字符串时是如何节省空间的?
  3. 定时任务卡死问题排查
  4. 取消计算机关机设置,旧驱动程序教您如何设置和取消计算机的自动关机命令
  5. 2016年第七届蓝桥杯C/C++ A组国赛 —— 第三题:打靶
  6. 进程的退出方式以及僵尸进程和孤儿进程
  7. Android 节操视频播放器jiecaovideoplayer自定义播放音频使用:屏蔽全屏按钮,增加倒计时,当前时间/总时间
  8. 在微型计算机中 如果电源突然中断,微型计算机在工作中电源突然中断,则其中的信息全部丢失,再次通电后也不能恢复的..._考试资料网...
  9. Docker 精通之微服务
  10. Cockos REAPER for Mac(音轨录制编辑软件)
  11. centos7 文件名中文乱码_Linux服务器文件名乱码常见问题
  12. printf 输出格式
  13. ADSL上网全攻略——故障解决
  14. rip路由协议计算机网络实验报告,RIP 动态路由协议的配置(实验报告).doc
  15. Cisco/Ruijie/H3C/华为 AAA认证配置
  16. Java项目:SSH汽车4S店管理系统
  17. 打开计算机网络自动连接,电脑网络自动连接如何设置
  18. c语言 threads.h 创建简单的通用多线程模块实例
  19. 吴恩达ex3_吴恩达机器学习 EX3 作业 第一部分多分类逻辑回归 手写数字
  20. 软件开发人员的人生指南-《软技能:代码之外的生存指南》

热门文章

  1. Spring Cloud 2020 版本最佳实践,你落伍了!
  2. 我和面试官的博弈:Redis 篇
  3. 30岁以上开发工程师,无法说出的悲哀与迷茫!
  4. 微服务在微信的架构实践
  5. 历经8年双11流量洗礼,淘宝开放平台架构和技术难点解密
  6. 90后IT男被准丈母娘拒绝:家境不重要,重要的是…戳中痛处
  7. IT人是这么过圣诞的……
  8. 给年轻人几点买房建议
  9. 给职场人士的四点良心建议
  10. python编译安装没有c扩展_python – 为什么我在安装simplejson时得到“C扩展无法编译”?...