ORM特性
核心原则:
- 简单性
- 传达性
- 精确性
优点
- 面向对象
不用编码,就可以向操作对象一样操作数据库 - 提高开发效率
ORM可以自动对实体对象与数据库中表进行字段与属性的映射,不需要单独的数据访问层就可以对数据进行增删改查。 - 方便转移数据库
当数据库发生改变时,不需要对模型进行改动,只需要修改映射关系就可以 了。
缺点
- 不够灵活,对于复杂查询,ORM力不从心。
- 执行效率低于直接 编写的SQL语句 。
- 性能损耗,ORM中的映射和关系管理是以牺牲性能为代价的
- 提高了学习成本。
使用场合
- 对性能要求不是很苛刻的程序
- 有一个转换的成本
- 开发时间紧迫时
- 有数据库迁移需求时
常见ORM框架
- NHibernate:Hibernate在.NET平台下的版本
- Batis.NET:iBatis在.NET平台的实现
- Linq to SQL(微软不再更新):.NET针对SQL server的ORM框架
- ADO.NET Entity Framework:微软在.NET4.0推出的领域驱动开发模型。
EF体系结构
- Data Providers
数据库的相关操作 - EDM(Entity Data Model实体数据模型)
概念层和逻辑层的映射,应用程序构建在该层之上 - 其他层
如何操作EDM
其中最重要的是EDM层,以下重点介绍EDM的内容
EDM(Entity Data Model实体数据模型)
EDM与ORM的关系:
EF作为实现了ORM思想的框架,其核心EDM的概念与ORM的概念是非常一致的,EDM的三层非别对应了ORM思想实体,关系,映射
EDM的层级关系:
CSDL(概念层)
概念:
CSDL定义了EDM或者说是整个程序的灵魂部分 – 概念模型。通俗地讲就是实体类。实体类是面向对象设计中一个最根本的组成部分,其体现了现实世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的
作用:
- 定义对象模型,以面向对象方式访问数据
- 负责向上的对象与属性显露与访问,说白了就是咱们建立的实体类;由概念架构定义语言文件 (.csdl)定义
XML文档介绍:
这部分XML文档,Schema是CSDL的根元素,其中定义的Namespace是用于ObjectContext与EntityClass的命名空间,Alias-别名为此命名空间Namespace指定一个易记的名称,在定义Alias之后,在此Schema内的Element均可用该Alias作为Namespace的别名
MSL(对应层)
概念:
- 概念层和存储层的映射
- 将上方的概念层和底下的储存层的数据结构对应在一起,起一个映射的作用;由映射规范语言文件 (.msl)定义
- 管理CSDL与SSDL的对应关系,建立实体类与数据库结构的一一映射
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="EFTestModelStoreContainer" CdmEntityContainer="EFTestEntities">
<EntitySetMapping Name="User">
<EntityTypeMapping TypeName="EFTestModel.User">
<MappingFragment StoreEntitySet="User">
<ScalarProperty Name="ID" ColumnName="ID" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="Sex" ColumnName="Sex" />
<ScalarProperty Name="deptment" ColumnName="deptment" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
MSL的根节点为Mapping,其中可以包含多个EntityContainerMapping,每一个EntityContainerMapping对应着两个分别来自CSDL与SSDL的EntityContainer。这个EntityContainerMapping就是描述这两个EntityContainer间的对应
SSDL(存储层)
作用:
- 与数据库管理系统中的数据做映射
- 依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生;由存储架构定义语言文件 (.ssdl)定义
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="EFTestModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2008" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl"> <!--生成过程中发现错误:警告 6002: 表/视图“EFTest.dbo.User”未定义主键。已推断出该键,并将定义创建为只读的表/视图。-->
<EntityType Name="User">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="varchar" MaxLength="50" Nullable="false" />
<Property Name="Name" Type="varchar" MaxLength="50" />
<Property Name="Sex" Type="varchar" MaxLength="50" />
<Property Name="deptment" Type="varchar" MaxLength="50" />
</EntityType>
<EntityContainer Name="EFTestModelStoreContainer">
<EntitySet Name="User" EntityType="Self.User" store:Type="Tables" store:Schema="dbo">
<DefiningQuery>SELECT [User].[ID] AS [ID], [User].[Name] AS [Name], [User].[Sex] AS [Sex], [User].[deptment] AS [deptment]FROM [dbo].[User] AS [User]</DefiningQuery>
</EntitySet>
</EntityContainer>
</Schema>
</edmx:StorageModels>
这个文件中描述了表、列、关系、主键及索引等数据库中存在的概念。文档的结构与CSDL很相似,只是其中EntityType等使用数据库的概念进行描述。其中有一个节点需要了解:DefiningQuery,他定义通过实体数据模型 (EDM) 内的客户端投影映射到数据存储视图的查询,就是下面文件中的查询语句
三者关系:
这三者合在一起就是EDM模式。
由于这个文件本质是一个xml文件,可以手工编辑此文件来自定义CSDL、MSL与SSDL这三部分。下面详细分析一下这个xml文件及三个其重要组成部分