实体数据模型关键概念

实体数据模型 (EDM) 使用三个关键概念来描述数据结构:“实体类型”、“关联类型”和“属性”。 在任何 EDM 实现中,这些都是描述数据结构的最重要概念。

实体类型

实体类型是用于描述实体数据模型中数据结构的基本构造块。 在概念模型中,实体类型都是从构造而来的,描述了顶级概念的结构,如业务应用程序中的客户和订单。 正如计算机程序中的类定义是用于类实例的模板一样,实体类型也是实体的模板。 实体表示一个特定对象(例如特定的客户或订单)。 每个实体都必须在某个实体集中具有唯一一个实体键。 实体集是指特定实体类型的实例集合。 实体集(及关联集)都是按逻辑分组在实体容器中。

实体类型支持继承功能:即一个实体类型可以从另一个实体类型中派生。 有关详细信息,请参阅实体数据模型:继承

关联类型

关联类型(也称为关联)是用来描述实体数据模型中的关系的基本构造块。 在概念模型中,关联表示两个实体类型(例如 Customer 和 Order)之间的关系。 每个关联都有两个关联端,用于指定关联中所涉及的实体类型。 每个关联端还会指定关联端重数,用于指示可位于关联端的实体数。 关联端重数的值可以为“一 (1)”、“零或一 (0..1)”或“多 (*)”。 通过导航属性或外键(如果实体类型上有)可以访问关联某一端的实体。 有关详细信息,请参阅外键属性

在应用程序中,关联实例表示特定的关联(例如 Customer 实例与 Order 实例之间的关联)。 关联实例按逻辑分组在关联集中。 关联集(及实体集)都是按逻辑分组在实体容器中。

属性

实体类型包含用于定义其结构和特征的属性。 例如,Customer 实体类型可能具有 CustomerId、Name 及 Address 这样的属性。

概念模型中的属性类似于对计算机程序中的类所定义的属性。 正如类的属性定义类的形状和携带有关对象的信息一样,概念模型中的属性也定义实体类型的形状和携带有关实体类型实例的信息。

属性可以包含基元数据(例如字符串、整数或布尔值)或结构化数据(例如复杂类型)。 有关详细信息,请参阅实体数据模型:基元数据类型

概念模型的表示形式

“概念模型”是某些作为实体和关系的数据结构的特定表示形式。 概念模型的一种表示形式是图表。 下图用三个实体类型(BookPublisherAuthor)以及两个关联(PublishedByWrittenBy)来表示概念模型:

Diagram showing a conceptual model with three entity types.

然而,如果要传达一些有关模型的详细信息,这种表现形式存在一些不足。 例如,图中没有传达属性类型和实体集信息。 域特定语言 (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>

请参阅