zoukankan      html  css  js  c++  java
  • Entity Framework(一) 映射

      ADO.NET Entity Framework通过Modeel First和DataBase First,提供了几个把数据库表映射到对象上的曾。通过Database First,可以从一个数据库架构开始,使用Visual Studio 项模版创建完整映射。还可以先用设计器(Model First)设计实体类,再把它映射到数据库上,在该数据库中,表和表之间的关系可以有完全不同的结构。

    需要定义的层如下:

      1、逻辑层--该层定义关系数据

      2、概念层--该层定义.NET类

      3、映射层--该层定义从.NET类到关系表和关系的映射。

    (1)逻辑层--逻辑层由SSDL(存储架构定义语言定义,描述数据库表及其关系的结构。)

     <edmx:StorageModels>
          <Schema Namespace="ExtjsmvcModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
            <EntityContainer Name="ExtjsmvcModelStoreContainer">
              <EntitySet Name="beian" EntityType="ExtjsmvcModel.Store.beian" store:Type="Tables" Schema="dbo" />
              <EntitySet Name="Menu" EntityType="ExtjsmvcModel.Store.Menu" store:Type="Tables" Schema="dbo" />
              <EntitySet Name="Users" EntityType="ExtjsmvcModel.Store.Users" store:Type="Tables" Schema="dbo" />
            </EntityContainer>
            <EntityType Name="beian">
              <Key>
                <PropertyRef Name="ID" />
              </Key>
              <Property Name="ID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
              <Property Name="kehu_name" Type="varchar" MaxLength="50" />
              <Property Name="beianhao" Type="varchar" MaxLength="100" />
              <Property Name="beianpass" Type="varchar" MaxLength="100" />
              <Property Name="beianemail" Type="varchar" MaxLength="100" />
              <Property Name="emailpass" Type="varchar" MaxLength="100" />
              <Property Name="beianzh" Type="varchar" MaxLength="100" />
              <Property Name="beianzhpa" Type="varchar" MaxLength="100" />
            </EntityType>
            <EntityType Name="Menu">
              <Key>
                <PropertyRef Name="ID" />
              </Key>
              <Property Name="ID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
              <Property Name="Menuname" Type="varchar" MaxLength="100" />
              <Property Name="ParentID" Type="int" />
              <Property Name="cls" Type="varchar" MaxLength="100" />
            </EntityType>
            <EntityType Name="Users">
              <Key>
                <PropertyRef Name="UserId" />
              </Key>
              <Property Name="UserId" Type="int" Nullable="false" />
              <Property Name="UserName" Type="varchar" MaxLength="100" />
              <Property Name="UserPwd" Type="varchar" MaxLength="100" />
            </EntityType>
          </Schema>
        </edmx:StorageModels>

    (2)概念层(定义.NET类)该层用CSDL--概念架构定义语言定义。

    <edmx:ConceptualModels>
          <Schema Namespace="ExtjsmvcModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
            <EntityContainer Name="ExtjsmvcEntities" annotation:LazyLoadingEnabled="true">
              <EntitySet Name="beian" EntityType="ExtjsmvcModel.beian" />
              <EntitySet Name="Menu" EntityType="ExtjsmvcModel.Menu" />
              <EntitySet Name="Users" EntityType="ExtjsmvcModel.Users" />
            </EntityContainer>
            <EntityType Name="beian">
              <Key>
                <PropertyRef Name="ID" />
              </Key>
              <Property Name="ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
              <Property Name="kehu_name" Type="String" MaxLength="50" Unicode="false" FixedLength="false" />
              <Property Name="beianhao" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
              <Property Name="beianpass" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
              <Property Name="beianemail" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
              <Property Name="emailpass" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
              <Property Name="beianzh" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
              <Property Name="beianzhpa" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
            </EntityType>
            <EntityType Name="Menu">
              <Key>
                <PropertyRef Name="ID" />
              </Key>
              <Property Name="ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
              <Property Name="Menuname" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
              <Property Name="ParentID" Type="Int32" />
              <Property Name="cls" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
            </EntityType>
            <EntityType Name="Users">
              <Key>
                <PropertyRef Name="UserId" />
              </Key>
              <Property Name="UserId" Type="Int32" Nullable="false" />
              <Property Name="UserName" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
              <Property Name="UserPwd" Type="String" MaxLength="100" Unicode="false" FixedLength="false" />
            </EntityType>
          </Schema>
        </edmx:ConceptualModels>

    (3)映射层(映射层使用MSL--映射规范语言 把CSDL中的实体类型定义映射到SSDL中)

    <edmx:Mappings>
          <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
            <EntityContainerMapping StorageEntityContainer="ExtjsmvcModelStoreContainer" CdmEntityContainer="ExtjsmvcEntities">
              <EntitySetMapping Name="beian">
                <EntityTypeMapping TypeName="ExtjsmvcModel.beian">
                  <MappingFragment StoreEntitySet="beian">
                    <ScalarProperty Name="ID" ColumnName="ID" />
                    <ScalarProperty Name="kehu_name" ColumnName="kehu_name" />
                    <ScalarProperty Name="beianhao" ColumnName="beianhao" />
                    <ScalarProperty Name="beianpass" ColumnName="beianpass" />
                    <ScalarProperty Name="beianemail" ColumnName="beianemail" />
                    <ScalarProperty Name="emailpass" ColumnName="emailpass" />
                    <ScalarProperty Name="beianzh" ColumnName="beianzh" />
                    <ScalarProperty Name="beianzhpa" ColumnName="beianzhpa" />
                  </MappingFragment>
                </EntityTypeMapping>
              </EntitySetMapping>
              <EntitySetMapping Name="Menu">
                <EntityTypeMapping TypeName="ExtjsmvcModel.Menu">
                  <MappingFragment StoreEntitySet="Menu">
                    <ScalarProperty Name="ID" ColumnName="ID" />
                    <ScalarProperty Name="Menuname" ColumnName="Menuname" />
                    <ScalarProperty Name="ParentID" ColumnName="ParentID" />
                    <ScalarProperty Name="cls" ColumnName="cls" />
                  </MappingFragment>
                </EntityTypeMapping>
              </EntitySetMapping>
              <EntitySetMapping Name="Users">
                <EntityTypeMapping TypeName="ExtjsmvcModel.Users">
                  <MappingFragment StoreEntitySet="Users">
                    <ScalarProperty Name="UserId" ColumnName="UserId" />
                    <ScalarProperty Name="UserName" ColumnName="UserName" />
                    <ScalarProperty Name="UserPwd" ColumnName="UserPwd" />
                  </MappingFragment>
                </EntityTypeMapping>
              </EntitySetMapping>
            </EntityContainerMapping>
          </Mapping>
        </edmx:Mappings>

      用设计器和CSDL创建的实体类一般派生自基类EntityObject。

      例如Users类派生自基类EntityObject,并为其数据定义属性,如UserName。这些属性的set访问器以两种不同的方式触发信息的改变:

      一种方式是调用EntityObject基类的ReportPropertyChanging()和ReportPropertyChanged()方法。调用这些方法会使用INotifyProperty Changing和INotifyPropertyChanged接口,以通知每个客户端用这些接口的事件来注册。

      另一种方式使用用部分方法,如OnTitleChanging()和OnTitleChanged()。他们默认没有实现方式,但可以在这个类的自定义扩展中实现他们。

      

  • 相关阅读:
    29Mybatis_整合ehcache以及应用场景
    28Mybatis_查询缓存-二级缓存-二级缓存测试-
    27Mybatis_一级缓存的实际应用场景
    解析分布式锁之Zookeeper实现(一)
    程序员的十年工作创业血泪史,万字长文,仔细读完,受益匪浅
    2018 Java线程热门面试题,你知道多少?
    看阿里P9架构师如何向你定义架构及架构师
    程序员30 岁之后:如何实现质的突破?
    强者自救,圣者渡人
    干货:通过双十一等项目实战看架构技术
  • 原文地址:https://www.cnblogs.com/xtt321/p/3620002.html
Copyright © 2011-2022 走看看