实体数据模型(EDM)使用三个关键概念来描述数据的结构:实体类型、关联类型和属性。 这些是描述 EDM 的任何实现中的数据结构的最重要概念。
实体类型
实体类型是用于使用实体数据模型描述数据结构的基本构建基块。 在概念模型中,实体类型基于 属性 构造,并描述顶级概念的结构,例如客户和业务应用程序中的订单。 与计算机程序中的类定义是类实例的模板相同,实体类型是实体的模板。 实体表示特定对象(如特定客户或订单)。 每个实体必须在实体集中具有唯一的实体键。 实体集是特定实体类型的实例的集合。 实体集(和 关联集)在 实体容器中以逻辑方式分组。
实体类型支持继承:也就是说,一个实体类型可以从另一个实体类型派生。 有关详细信息,请参阅 实体数据模型:继承。
关联类型
关联类型(也称为关联)是描述实体数据模型中关系的基本构建基块。 在概念模型中,关联表示两种实体类型(如 Customer 和 Order)之间的关系。 每个关联都有两个 关联结束 ,用于指定关联中涉及的实体类型。 每个关联端还指定一个 关联端乘数 ,指示可位于关联末尾的实体数。 关联端重数的值可以为“一 (1)”、“零或一 (0..1)”或“多 (*)”。 通过导航属性或外键(如果实体类型上有)可以访问关联某一端的实体。 有关详细信息,请参阅 外键属性。
在应用程序中,关联实例表示特定关联(例如 Customer 实例与 Order 实例之间的关联)。 关联实例在 关联集中以逻辑方式分组。 关联集(和 实体集)在 实体容器中逻辑分组。
资产
实体类型 包含定义其结构和特征 的属性 。 例如,Customer 实体类型可能具有 CustomerId、Name 和 Address 等属性。
概念模型中的属性类似于在计算机程序中的类上定义的属性。 与类上的属性定义类的形状并承载有关对象的信息的方式相同,概念模型中的属性定义实体类型的形状并携带有关实体类型实例的信息。
属性可以包含基元数据(如字符串、整数或布尔值),或结构化数据(如复杂类型)。 有关详细信息,请参阅 实体数据模型:基元数据类型。
概念模型的表示形式
概念模型是某些数据结构作为实体和关系的特定表示形式。 表示概念模型的方法之一是使用关系图。 下图表示一个概念模型,其中包含三个实体类型(Book、Publisher和Author)以及两个关联(PublishedBy和WrittenBy)。
但是,在传达有关模型的一些细节时,这种表示形式存在一些缺点。 例如,关系图中未传达属性类型和实体集信息。 概念模型的丰富性可以用特定于域的语言(DSL)更清晰地传达。 ADO.NET 实体框架使用名为概念架构定义语言(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>