實體數據模型 (EDM) 使用三個主要概念來描述數據的結構:實體類型、關聯類型和屬性。 這些是描述任何EDM實作中數據結構的最重要概念。
實體類型
實體類型是使用實體數據模型描述數據結構的基本建置組塊。 在概念模型中,實體類型是從 屬性 建構,並描述最上層概念的結構,例如商務應用程式中的客戶和訂單。 如同計算機程式中的類別定義是 類別實例的範本,實體類型是實體的範本。 實體代表特定物件(例如特定客戶或訂單)。 每個實體在實體集內都必須有唯一的實體索引鍵。 實體集是特定實體類型的實例集合。 實體集(和 關聯集)會在 實體容器中以邏輯方式分組。
實體類型支援繼承:也就是說,一個實體類型可以從另一個實體類型衍生。 如需詳細資訊,請參閱 實體數據模型:繼承。
關聯類型
關聯類型(也稱為關聯)是描述實體數據模型中關聯性的基本建置組塊。 在概念模型中,關聯代表兩個實體類型之間的關聯性(例如 Customer 和 Order)。 每個關聯都有兩個 關聯結尾 ,指定關聯所涉及的實體類型。 每個關聯端也會指定 關聯端多重性 ,指出可以存在於關聯的一端的實體數目。 關聯端多重性可以有一個值(一)、零或一(0..1),或多個(*)。 在關聯一端的實體可以透過 導覽屬性存取,或在實體類型上公開時透過外鍵存取。 如需詳細資訊,請參閱 外鍵屬性。
在應用程式中,關聯實例代表特定關聯(例如 Customer 實例與 Order 實例之間的關聯)。 關聯實例會以邏輯方式分組在 關聯集內。 關聯集(和 實體集)會以邏輯方式分組在 實體容器中。
房產
實體類型 包含 定義 其結構和特性的屬性。 例如,Customer 實體類型可能會有 CustomerId、Name 和 Address 等屬性。
概念模型中的屬性類似於計算機程序類別上定義的屬性。 與類別上的屬性定義類別的圖形並攜帶對象相關信息相同,概念模型中的屬性會定義實體類型的圖形,並攜帶實體類型實例的相關信息。
屬性可以包含基本數據(例如字串、整數或布爾值),或結構化數據(例如複雜類型)。 如需詳細資訊,請參閱 實體數據模型:基本數據類型。
概念模型的表示法
概念模型是某些數據結構的特定表示法,做為實體和關聯性。 代表概念模型的方法之一是使用圖表。 下圖代表一個概念模型,其中包含三個實體類型 (Book、 Publisher和 Author) 和兩個關聯 (PublishedBy 和 WrittenBy):
不過,在傳達模型相關詳細數據時,這個表示法有一些缺點。 例如,圖表中不會傳達屬性類型和實體集資訊。 概念模型的豐富性可以更清楚地以領域特定語言 (DSL) 傳達。 ADO.NET Entity Framework 會使用稱為概念架構定義語言 (CSDL) 的 XML 型 DSL 來定義概念模型。 以下是上圖中概念模型的 CSDL 定義:
<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm"
xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
Namespace="BooksModel" Alias="Self">
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
<EntityType Name="Publisher">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" />
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
FromRole="Publisher" ToRole="Book" />
</EntityType>
<EntityType Name="Author">
<Key>
<PropertyRef Name="Name" />
<PropertyRef Name="Address" />
</Key>
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
FromRole="Author" ToRole="Book" />
</EntityType>
<Association Name="PublishedBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" />
<End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
</Association>
<Association Name="WrittenBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" />
<End Type="BooksModel.Author" Role="Author" Multiplicity="*" />
</Association>
</Schema>