• EF框架核心--EDM设计器


              上篇一直再说EDM,但是什么是EDM呢?

              Entity Data Model就是所谓的实体数据模型,也就是EDM.VS中添加ADO.NET实体数据模型就可以直接画实体,向上可以方便我们的开发,向下直接映射到数据库,开发人员操作实体无须了解数据库表结构.下面就是.edmx中的两个实体了,我们这里不涉及数据库的概念,而是用一个叫做DBContext的上下文对象表示这些实体的集合.

              EDM设计器可以设计上面的模型,这个模型包括定义实体,主键,属性,关联,,,关系和索引等.其实,EDM的本质是一个xml文件,右击该文件可以选择用xml编辑器打开.这样一个文件复杂得让我们有点望而却步,先不要迫不及待地关掉它,听我说完:

     

    EDM的三部分:

     

    1. CSDL-概念模型,由概念架构定义语言文件(.csdl)来定义
    2. 存储模型,由存储架构定义语言文件(.ssdl)来定义
    3. 映射,由映射规范语言文件(.msl)来定义

     

    整个xml文件折叠起来如下所示:

    首先,CSDL就是实体类,它定义了应用程序的业务层所知道的实体和关系,EntityType表示实体,EntitySet表示实体集,Association表示关系,key表示主键等.这是面向对象设计中一个最根本的组成部分,它体现了现实世界中对象最为一种计算中可以表示的对象设计方法.下面的代码有点长,主要是为了体现UserInfos和Departments的关联关系,这里给出了两个实体集的标量属性,Navigation Property是导航属性.

     

     1 <edmx:ConceptualModels>  
     2       <Schema Namespace="HighSchoolBaseTestModel" Alias="Self" p1:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:p1="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">  
     3         <EntityContainer Name="HighSchoolBaseTestModelEntities" p1:LazyLoadingEnabled="true">  
     4           <EntitySet Name="Departments" EntityType="HighSchoolBaseTestModelModel.Departments" />            
     5           <EntitySet Name="UserInfos" EntityType="HighSchoolBaseTestModelModel.UserInfos" />  
     6           <AssociationSet Name="DepartmentUserInfo" Association="HighSchoolBaseTestModelModel.DepartmentUserInfo">  
     7             <End Role="Departments" EntitySet="Departments" />  
     8             <End Role="UserInfos" EntitySet="UserInfos" />  
     9           </AssociationSet>  
    10         </EntityContainer>  
    11         <EntityType Name="Departments">  
    12           <Key>  
    13             <PropertyRef Name="ID" />  
    14           </Key>  
    15           <Property Name="ID" Type="Int32" Nullable="false" />  
    16           <Property Name="Name" Type="String" Nullable="false" MaxLength="32" Unicode="true" FixedLength="false" />  
    17           <NavigationProperty Name="UserInfos" Relationship="HighSchoolBaseTestModelModel.DepartmentUserInfo" FromRole="Departments" ToRole="UserInfos" />  
    18         </EntityType>       
    19         <EntityType Name="UserInfos">  
    20           <Key>  
    21             <PropertyRef Name="ID" />  
    22           </Key>  
    23           <Property Name="ID" Type="Int32" Nullable="false" />  
    24           <Property Name="UserName" Type="String" Nullable="false" MaxLength="32" Unicode="true" FixedLength="false" />  
    25           <Property Name="UserPassword" Type="String" Nullable="false" MaxLength="Max" Unicode="true" FixedLength="false" />  
    26           <NavigationProperty Name="Departments" Relationship="HighSchoolBaseTestModelModel.DepartmentUserInfo" FromRole="UserInfos" ToRole="Departments" />  
    27         </EntityType>  
    28         <Association Name="DepartmentUserInfo">  
    29           <End Role="Departments" Type="HighSchoolBaseTestModelModel.Departments" Multiplicity="*" />  
    30           <End Role="UserInfos" Type="HighSchoolBaseTestModelModel.UserInfos" Multiplicity="*" />  
    31         </Association>          
    32       </Schema>  
    33   
    34 </edmx:ConceptualModels> 
    View Code

     

    然后,SSDL描述了表,,关系,主键及索引等数据库中存在的概念.EntityContainer根据数据库命名,每个EntitySet都对应一个表AssociationSet表示关系.概念模型和逻辑模型可以是一对一的关联关系,但也不必以一对一的方式链接,这就是EDM的功能,比如,概念模型中的一个实体,实际上这个实体从数据库的多个表中派生其数据.大家可以对应着看一下xml文件,都可以看懂.说到这里,当在实体类设计器中导入无主键的表时会出错,目前为止我们还是确保数据库表有主键的前提再导入吧.

            最后,MSL中主要是以上CSDLSSDL的对应,包括CSDL中属性与SSDL中列的对应.

    StorageEntityContainerStoreEntitySet 是存储中的名称,CdmEntityContainer和TypeName分别是对应的模型中的名称.这是两层模型彼此间的映射,这一映射使得开发人员针对概念模型编写代码即操作实体,这些指令通过映射就到了逻辑模型那里.

     

    <EntityContainerMapping StorageEntityContainer="HighSchollBaseTestModelModelStoreContainer" CdmEntityContainer="HighSchollBaseTestModelEntities">  
        <EntitySetMapping Name="Departments">  
          <EntityTypeMapping TypeName="IsTypeOf(HighSchollBaseTestModelModel.Departments)">  
            <MappingFragment StoreEntitySet="Departments">  
              <ScalarProperty Name="ID" ColumnName="ID" />  
              <ScalarProperty Name="Name" ColumnName="Name" />  
            </MappingFragment>  
          </EntityTypeMapping>  
        </EntitySetMapping>  
      
    </EntityContainerMapping> 
    View Code

     

    经过跟代码,大家一定对EDM有了一定的认识,其实对于计算机来说,整个世界都是0和1,那么我们所看到的一切东西也都能通过代码来展现,这么丰富好用的设计器背后还不一样是最基本的XML么?下面用一张图来表示EDM的核心:

    实体数据模型的关系

                                   实体数据模型关系

     

     

     

  • 相关阅读:
    10-02 青蛙跳台阶(斐波那契数列的应用)
    10-01 斐波那契数列
    08 二叉树的下一个节点
    07 重建二叉树
    Java中如何调用静态方法
    Java中如何调用静态方法
    Java方法调用数组,是否改变原数组元素的总结
    Java方法调用数组,是否改变原数组元素的总结
    JAVA中,一个类中,方法加不加static的区别,
    JAVA中,一个类中,方法加不加static的区别,
  • 原文地址:https://www.cnblogs.com/wuzhenglong/p/6477472.html
Copyright © 2020-2023  润新知