標籤: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的三部分:
- CSDL-概念性模型,由概念結構定義語言檔案(.csdl)來定義
- 儲存模型,由存放結構定義語言檔案(.ssdl)來定義
- 映射,由對應規格語言檔案(.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設計器