通过前三篇博客的介绍,相信大家都已经学会EF的基本使用了。但是这仅仅是第一步,咱们还需要深入了解EF的核心机制,将来还会做EF的性能优化等等。今天就来刨根究底一下,EF的核心EDM;
EDM的全称为Entity Data Model(实体数据模型),大家可能不明白他是个什么东西,其实咱们在使用DBFirst和ModelFirst的时候都接触过EDM。EDM模式在项目中的表现形式就是扩展名为.edmx的文件。这个包含EDM的文件可以使用Visual Studio中的EDM设计器来设计,
如下图:
EDM由三个概念组成
(1) 概念层:负责向上的对象与属性显露与访问,说白了就是咱们建立的实体类;由概念架构定义语言文件 (.csdl)定义
(2) 对应层:将上方的概念层和底下的储存层的数据结构对应在一起,起一个映射的作用;由映射规范语言文件 (.msl)定义
(3) 存储层:依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生;由存储架构定义语言文件 (.ssdl)定义
这三者合在一起就是EDM模式。由于这个文件本质是一个xml文件,可以手工编辑此文件来自定义CSDL、MSL与SSDL这三部分。下面详细分析一下这个xml文件及三个其重要组成部分:
EDM之CSDL
CSDL定义了EDM或者说是整个程序的灵魂部分 – 概念模型。通俗地讲就是实体类。实体类是面向对象设计中一个最根本的组成部分,其体现了现实世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的。
这部分XML文档,Schema是CSDL的根元素,其中定义的Namespace是用于ObjectContext与EntityClass的命名空间,Alias-别名为此命名空间Namespace指定一个易记的名称,在定义Alias之后,在此Schema内的Element均可用该Alias作为Namespace的别名。
EDM之SSDL
这个文件中描述了表、列、关系、主键及索引等数据库中存在的概念。文档的结构与CSDL很相似,只是其中EntityType等使用数据库的概念进行描述。其中有一个节点需要了解:DefiningQuery,他定义通过实体数据模型 (EDM) 内的客户端投影映射到数据存储视图的查询,就是下面文件中的查询语句。
<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">
<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>
EDM之MSL
MSL文件的作用就是管理 CSDL与SSDL之间的对应关系了。建立实体类与数据库结构的一一映射
<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间的对应。
EDM与ORM
看完上面对EDM的详细介绍后,大家脑子里肯定浮现了出了一个名词ORM。没错EF作为实现了ORM思想的框架,其核心EDM的概念与ORM的概念是非常一致的,EDM的三层非别对应了ORM思想实体,关系,映射。
关于EDM的介绍就说到这里,更加详细的解说请看:http://www.cnblogs.com/lsxqw2004/archive/2009/05/31/1495240.html#_Toc228672768
后续博客将陆续推出EF在具体项目中应用的问题,以及性能优化,敬请关注。