Entity Framework的核心 – EDM(Entity Data Model) 一
http://blog.csdn.net/wangyongxia921/article/details/42061695
一、EnityFramework
EnityFramework的全程是ADO.NET Entity Framework 。和Nhibernate一样,EF
同样是遵守ORM的思想,利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性
(property),关系则转换为结合属性 (association),让数据库的 E/R
模型完全的转成对象模型,如此让程序设计师能用最熟悉的编程语言来调用访问。
EF是如何来实现这个原理的呢?
EF中存在一个主要的文件:*.edm 。这就是EF的核心。EF以EDM( Entity Data Model
)
为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema
三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用,今天咱们讨论的是EDM,先看图:
这三层的功能分别是:
二、edm对应的XML
edm 有三层,与之对应的xml也有三层:csdl(Conceptual Schema Definition
Language),msl(Mapping Specification Language),ssdl(Storage Schema
Definition Language)。
1、CSDL基本结构
这个文件完全以程序语言的角度来定义模型的概念。即其中定义的实体、主键、属性、关联等都是对应于.NET Framework中的类型。下面是csdl的基本结构,没有实体关联:
- <EntityContainer Name="EmployeesContext">
- <EntitySet Name="Employees" EntityType="Employees.Employees" />
- </EntityContainer>
- <EntityType Name="Employees">
- <Key>
- <PropertyRef Name="EmployeeId" />
- </Key>
- <Property Name="EmployeeId" Type="Guid" Nullable="false" />
- <Property Name="LastName" Type="String" Nullable="false" />
- <Property Name="FirstName" Type="String" Nullable="false" />
- <Property Name="Email" Type="String" Nullable="false" />
- </EntityType>
每个节点含义如下;
|
EntityContainer |
|||
|
Name |
EntityContainer的名称,其将作为产生的ObjectContext类的名称 |
||
|
EntitySet |
|||
|
Name |
ObjectContext内与此Entity类型对应的属性名 |
||
|
EntityType |
ObjectContext内与此Entity类型对应的属性的类型 |
||
|
AssociationSet |
|||
|
End |
有两个End子节点,分别描述建立此关系的两个EntitySet |
||
|
Role |
对应到Association中End节的Role属性,起到将AssociationSet与Association相关连的作用。 |
||
注意:如果 该实体有与其他实体关联,有如下变动:
(1):那么在EntityContainer中就会多出一个Association节点,Association节,这是真正定义关系的地方。看如下实例:
- <EntityContainer Name="ITOO_UIEntities" annotation:LazyLoadingEnabled="true">
- <EntitySet Name="Controls" EntityType="ITOO_UIModel.Controls" />
- <EntitySet Name="NonQueryProperties" EntityType="ITOO_UIModel.NonQueryProperties" />
- <EntitySet Name="QueryProperties" EntityType="ITOO_UIModel.QueryProperties" />
- <AssociationSet Name="ControlsQueryProperties" Association="ITOO_UIModel.ControlsQueryProperties">
- <End Role="Controls" EntitySet="Controls" />
- <End Role="QueryProperties" EntitySet="QueryProperties" />
- </AssociationSet>
- <<span style="color:#FF0000;">AssociationSet</span> Name="ControlsNonQueryProperties" Association="ITOO_UIModel.ControlsNonQueryProperties">
- <End Role="Controls" EntitySet="Controls" />
- <End Role="NonQueryProperties" EntitySet="NonQueryProperties" />
- </AssociationSet>
- </EntityContainer>
(2)EntityType节点中增加:NavigationProperty节点
- <EntityType Name="NonQueryProperties">
- <Key>
- <PropertyRef Name="NonQueryId" />
- </Key>
- <Property Name="NonQueryId" Type="Guid" Nullable="false" />
- <Property Name="PropertyName" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" />
- <Property Name="PropertyDesc" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" />
- <Property Name="ControlHtmlName" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" />
- <Property Name="ControlHtmlId" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" />
- <Property Name="IsNecessary" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" />
- <Property Name="IsShow" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" />
- <Property Name="EntityName" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" />
- <Property Name="EntityDesc" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" />
- <NavigationProperty Name="Controls" Relationship="ITOO_UIModel.ControlsNonQueryProperties" FromRole="NonQueryProperties" ToRole="Controls" />
- </EntityType>
具体节点的含义如下:
|
EntityType |
|||
|
Name |
Entity Class的名称 |
||
|
Abstract |
是否为抽象类 |
||
|
BaseType |
父类 |
||
|
Key |
主键 |
||
|
Property |
主键之属性 |
||
|
Name |
属性名 |
||
|
Property |
属性 |
||
|
Name |
属性名 |
||
|
Type |
属性类型 |
||
|
Nullable |
是否允许null |
||
|
MaxLength |
属性最大长度 |
||
|
FixLength |
是否固定长度 |
||
|
NavigationProperty |
关系属性 |
||
这就是基本的CSDL ,你在edm中添加一个实体,用模型画出来的,然后通过打开XML方式来查看,对比XML中的csdl ,你会发现两者一样。
下篇继续:edm中ssdl。
Entity Framework的核心 – EDM(Entity Data Model) 一的更多相关文章
- Entity Framework连接Mysql数据库并生成Model和DAL层
Entity Framework (EF,ADO.NET Entity Framework)是微软官方提供的.NET平台的ORM框架.相比于LINQ TO SQL,EF框架具有很明显的优势: EF框架 ...
- mvc+entity framework database first,生成的model每次更新一个表会更新所有的model
在使用Entity Framework 的Database frist或model first时,直接加attribute到modle类上是太现实也不合理的,因为model类是自动生成的,重新生成后会 ...
- Lerning Entity Framework 6 ------ Working with in-memory data
Sometimes, you need to find some data in an existing context instead of the database. By befault, En ...
- Entity Framework 教程——什么是Entity Framework
什么是Entity Framework 编写和管理ADO.NET是一个繁琐而又无聊的工作.微软为你的应用提供了一个名为"Entity Framework"的ORM框架来自动化管理你 ...
- Entity Framework入门教程: Entity Framework支持的查询方式
Entity Framework支持的查询方式有三种 LINQ to Entities Entity SQL Native SQL [LINQ to Entities] LINQ(语言集成查询)是从V ...
- Entity Framework 全面教程详解(转)
目录 预备知识 2 LINQ技术 2 LINQ技术的基础 - C#3.0 2 自动属性 2 隐式类型 2 对象初始化器与集合初始化器 3 匿名类 3 扩展方法 ...
- 转载Entity Framework全面教程
转载原地址:http://www.cnblogs.com/lsxqw2004/archive/2009/05/31/1495240.html#_Toc228672754 预备知识 2 LINQ技 ...
- Entity Framework 配置
Entity Framework的核心 – EDM(Entity Data Model) EDM概述 实体数据模型,简称EDM,由三个概念组成.概念模型由概念架构定义语言文件 (.csdl)来定义,映 ...
- Entity Framework 教程(转)
预备知识 2 LINQ技术 2 LINQ技术的基础 - C#3.0 2 自动属性 2 隐式类型 2 对象初始化器与集合初始化器 3 匿名类 3 扩展方法 ...
随机推荐
- Allegro PCB SI (2)
整理一下在电研院学的si (虽然彩超的si在频率15Mhz以上后,si是失真的.昨晚遇到孔大哥也是这样说的,板级仿真,要layout过硬,然后找到合适的top test point) Allegro ...
- Ogre中OctreeSceneManager
转自:http://blog.csdn.net/yanonsoftware/article/details/1067265 既然前面分析Mesh(Entity,SceneNode)的渲染时已经看到了O ...
- 在.net中实现在textbox中按ctrl+enter进行数据的提交
textbox.Attributes.Add("onKeydown", "if(event.ctrlKey&&event.keyCode == 13){d ...
- 转载 javascript中的正则表达式总结 一
定义正则表达式的方法 定义正则表达式的方法有两种:构造函数定义和正则表达式直接量定义.例如: var reg1 = new RegExp('\d{5, 11}'); // 通过构造函数定义 var r ...
- jquery模拟淘宝购物车
今天要实现的一个功能页面就是利用jquery代码模拟一个淘宝网的购物车结算页面 总体页面效果如图: 首先我们要实现的内容的需求有如下几点: 1.在购物车页面中,当选中“全选”复选框时,所有商品前的复选 ...
- nginx源码学习资源(不断更新)
nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...
- Qt Clipboard剪贴板简单使用
设置剪贴板的内容 QClipboard *clipboard = QApplication::clipboard(); clipboard->setText("contents&quo ...
- Java 返回一个整数的各个数字之和的一种方法
public static long sumDigits(long n){ long total=0; long number=n; while(number!=0){ total=total+num ...
- ajax简单后台交互-我们到底能走多远系列(28)
我们到底能走多远系列(28) 1,扯淡 单身的生活,大部分时间享受自由,小部分时间忍受寂寞. 生活有时候,其实蛮苦涩,让人难以下咽.那些用岁月积累起来的苦闷,无处宣泄,在自己的脑海里蔓延成一片片荆棘, ...
- ubuntu13 安装并配置ssh,交换密钥
1.下载安装sudo apt-get install ssh,若出现问题,可选择安装openssh-server,或ssh-server等 2.启动ssh,命令:sudo /etc/init.d/ss ...