【.NET】EF架構之Entity Framework的核心--EDM設計器

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   os   sp   strong   on   

        上篇部落格初步認識EF,總是在說EDM,到底什麼是EDM呢?下面我們就來揭開它神秘的面紗:   xml中那些"亂七八糟"的代碼.

 

          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是導覽屬性.

<edmx:ConceptualModels>      <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">        <EntityContainer Name="HighSchoolBaseTestModelEntities" p1:LazyLoadingEnabled="true">          <EntitySet Name="Departments" EntityType="HighSchoolBaseTestModelModel.Departments" />                    <EntitySet Name="UserInfos" EntityType="HighSchoolBaseTestModelModel.UserInfos" />          <AssociationSet Name="DepartmentUserInfo" Association="HighSchoolBaseTestModelModel.DepartmentUserInfo">            <End Role="Departments" EntitySet="Departments" />            <End Role="UserInfos" EntitySet="UserInfos" />          </AssociationSet>        </EntityContainer>        <EntityType Name="Departments">          <Key>            <PropertyRef Name="ID" />          </Key>          <Property Name="ID" Type="Int32" Nullable="false" />          <Property Name="Name" Type="String" Nullable="false" MaxLength="32" Unicode="true" FixedLength="false" />          <NavigationProperty Name="UserInfos" Relationship="HighSchoolBaseTestModelModel.DepartmentUserInfo" FromRole="Departments" ToRole="UserInfos" />        </EntityType><EntityType Name="UserInfos">          <Key>            <PropertyRef Name="ID" />          </Key>          <Property Name="ID" Type="Int32" Nullable="false" />          <Property Name="UserName" Type="String" Nullable="false" MaxLength="32" Unicode="true" FixedLength="false" />          <Property Name="UserPassword" Type="String" Nullable="false" MaxLength="Max" Unicode="true" FixedLength="false" />          <NavigationProperty Name="Departments" Relationship="HighSchoolBaseTestModelModel.DepartmentUserInfo" FromRole="UserInfos" ToRole="Departments" />        </EntityType>        <Association Name="DepartmentUserInfo">          <End Role="Departments" Type="HighSchoolBaseTestModelModel.Departments" Multiplicity="*" />          <End Role="UserInfos" Type="HighSchoolBaseTestModelModel.UserInfos" Multiplicity="*" />        </Association>  </Schema></edmx:ConceptualModels>

        然後,SSDL描述了表,列,關係,主鍵及索引等資料庫中存在的概念.EntityContainer根據資料庫命名,每個EntitySet都對應一個表AssociationSet表示關係.概念性模型和邏輯模型可以是一對一的關聯關係,但也不必以一對一的方式連結,這就是EDM的功能,比如,概念性模型中的一個實體,實際上這個實體從資料庫的多個表中派生其資料.大家可以對應著看一下xml檔案,都可以看懂.說到這裡,當在實體類別設計工具中匯入無主鍵的表時會出錯,目前為止我們還是確保資料庫表有主鍵的前提再匯入吧. 

 

        最後,MSL中主要是以上CSDL與SSDL的對應,包括CSDL中屬性與SSDL中列的對應.

StorageEntityContainer和StoreEntitySet 是儲存中的名稱,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>

      經過跟代碼,大家一定對EDM有了一定的認識,其實對於電腦來說,整個世界都是0和1,那麼我們所看到的一切東西也都能通過代碼來展現,這麼豐富好用的設計器背後還不一樣是最基本的XML麼?下面用一張圖來表示EDM的核心:

                      

                                                                     實體資料模型的關係



【.NET】EF架構之Entity Framework的核心--EDM設計器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.