ADO.NET实体框架Entity Framework模型-基于元数据解析
上一篇简单介绍了EF的XML模型结构,在基于xml解析一文中,主要使用xml查询技术Xpath,XQuery来得到实体模型中相应信息的,由于这种方式在数据库庞大,表关系复杂的情况下,有诸多弊端,所有使用基于元数据解析EF将更加简单便捷,适用性强。
本文主要介绍EDM元数据及其操作,实现功能与ADO.NET实体框架Entity Framework模型-基于XML解析类似,有些增强。
操作元数据一般使用以下几个步骤:
- 读取EDM模型
- 获取实体结构
- 获取功能结构
- 组织需要数据
通过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模型-基于元数据解析的更多相关文章
- ADO.NET实体框架Entity Framework模型-基于XML解析
最近由于项目需求,需要对实体框架内表之间的关系进行处理,主要功能要求是通过一表名,返回其在实体框架内的所有关系表.主外键及每个字段的属性.先简单描述我解决这个问题从开始到最后的分析实现 ...
- 实体框架(Entity Framework)快速入门
实体 框架 (Entity Framework )简介 实体框架Entity Framework 是 ADO .NET 中的一组支持 开发 面向数据的软件应用程序的技术.是微软的一个ORM框架. OR ...
- C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名
转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...
- 实体框架(Entity Framework)快速入门--实例篇
在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...
- 实体框架Entity Framework 4.1快速入门
介 绍 在旧的Entity 框架中,开发者可以从已存在的数据库中产生业务实体的模型,这种开发方法被称为数据库驱动的开发方法.而在4.1的Entity Framework中,支开发者先创建实体业务类,然 ...
- 实体框架—Entity Framework
简称EF,是微软以ADO.NET为基础所发展出来的对象关系对应(ORM)解决方案. EF就是用来处理数据的,与数据库打交道.但是底层还是用到了ADO.NET的那一套东西. 为什么叫对象关系对应解决方案 ...
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
http://www.cnblogs.com/xlovey/archive/2011/01/03/1924800.html ADO.NET 实体框架概述 新版本中的 ADO.NET 以新实体框架为特色 ...
- [转] ADO.NET实体框架引发争论
转自:http://developer.51cto.com/art/200811/76356.htm 2008-11-11 14:00 朱永光译 infoq 我要评论(0) 一个在ADO.NET实体框 ...
- ORM框架Entity Framework
博客园在推广ORM方面的确做了很大的贡献,很多的程序员开始使用ORM,不用写SQL的喜悦让他们激动不已,可是好景不长,他们很快发现众多的烦恼一个接一个的出现了. 很遗憾,我并不打算在这篇文章中解决这些 ...
随机推荐
- ECMAScript6补全字符串长度方法padStart()和padEnd()
一.padStart() 1.定义 padStart()方法用另一个字符串(默认为空格)重复填充到对象字符串到指定长度,填充从对象字符串左侧开始,返回新的字符串. 2.语法 str.padStart( ...
- struts2+Oracle实现管理员查看用户提交的意见功能
说一下需求:这个功能类似于邮件功能,当用户在站点中提交一些建议及意见后.后台将其存入到Oracle数据库中.然后管理员登录站点,会看到还没有读过以及读过的意见及建议,并能够将未读过的意见及建议标记为已 ...
- ThreadLocal (二):什么时候使用 InheritableThreadLocal
一.ThreadLocal 在父子线程传递的问题 public class InheritableThreadLocalDemo { // 全局变量 // static ThreadLocal< ...
- Python学习笔记2_Python基础
一.变量(给数据起个名字) 变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变. 1.变量的命名方法 -变量名有字母.数字.下划线组成 -不能以数字开头 -不可以使用关键字 -a ...
- c# 如何设置透明画刷
使用solidBrush新建画刷,定义画刷的颜色为透明色 Brush b = new SolidBrush(Color.FromArgb(50, Color.Green)); 这里的50是透明度的设置 ...
- 【数学建模】MATLAB学习笔记——函数式文件
MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...
- 函数没有返回值,默认返回undefined
var a =( function(){return})(); a = undefined;
- 计算机网络概述 传输层 TCP拥塞控制
TCP拥塞控制 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就 ...
- 一个可以查询CSS属性兼容性的网站。
平时遇到CSS属性是不是道理具体兼容哪些网站,就可以直接上这个网站查询啦.http://www.caniuse.com/ 这个是网站地址. 例如查询 inline-block属性兼容性 就可以看到 ...
- java配置文件转义问题
场景: 配置文件config.properties 配置项cfg.regexp=\d+\t 加载配置文件代码 InputStream ins = PropManager ...
