EF学习和使用(四)解析EF的核心-EDM


通过前三篇博客的介绍,相信大家都已经学会EF的基本使用了。但是这仅仅是第一步,咱们还需要深入了解EF的核心机制,将来还会做EF的性能优化等等。今天就来刨根究底一下,EF的核心EDM;

EDM的全称为Entity Data Model(实体数据模型),大家可能不明白他是个什么东西,其实咱们在使用DBFirst和ModelFirst的时候都接触过EDM。EDM模式在项目中的表现形式就是扩展名为.edmx的文件。这个包含EDM的文件可以使用Visual Studio中的EDM设计器来设计,
如下图:

EF学习和使用(四)解析EF的核心-EDM_第1张图片

EDM由三个概念组成

(1) 概念层:负责向上的对象与属性显露与访问,说白了就是咱们建立的实体类;由概念架构定义语言文件 (.csdl)定义

(2) 对应层:将上方的概念层和底下的储存层的数据结构对应在一起,起一个映射的作用;由映射规范语言文件 (.msl)定义

(3) 存储层:依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生;由存储架构定义语言文件 (.ssdl)定义

这三者合在一起就是EDM模式。由于这个文件本质是一个xml文件,可以手工编辑此文件来自定义CSDL、MSL与SSDL这三部分。下面详细分析一下这个xml文件及三个其重要组成部分:

EF学习和使用(四)解析EF的核心-EDM_第2张图片

EDM之CSDL

CSDL定义了EDM或者说是整个程序的灵魂部分 – 概念模型。通俗地讲就是实体类。实体类是面向对象设计中一个最根本的组成部分,其体现了现实世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的。

EF学习和使用(四)解析EF的核心-EDM_第3张图片


这部分XML文档,Schema是CSDL的根元素,其中定义的Namespace是用于ObjectContext与EntityClass的命名空间,Alias-别名为此命名空间Namespace指定一个易记的名称,在定义Alias之后,在此Schema内的Element均可用该Alias作为Namespace的别名。

EDM之SSDL

这个文件中描述了表、列、关系、主键及索引等数据库中存在的概念。文档的结构与CSDL很相似,只是其中EntityType等使用数据库的概念进行描述。其中有一个节点需要了解:DefiningQuery,他定义通过实体数据模型 (EDM) 内的客户端投影映射到数据存储视图的查询,就是下面文件中的查询语句。

  <!-- 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>

EDM之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间的对应。

EDM与ORM


看完上面对EDM的详细介绍后,大家脑子里肯定浮现了出了一个名词ORM。没错EF作为实现了ORM思想的框架,其核心EDM的概念与ORM的概念是非常一致的,EDM的三层非别对应了ORM思想实体,关系,映射。

EF学习和使用(四)解析EF的核心-EDM_第4张图片

关于EDM的介绍就说到这里,更加详细的解说请看:http://www.cnblogs.com/lsxqw2004/archive/2009/05/31/1495240.html#_Toc228672768


后续博客将陆续推出EF在具体项目中应用的问题,以及性能优化,敬请关注。

你可能感兴趣的:(edm,MSL,SSDL,CSDL)