实体集 (EDM)

在 实体数据模型 (EDM) 中,EntitySet 是单一类型的实体的逻辑容器。同样,AssociationSet 是同一类型的关联的容器。在架构中定义的实体集和关联集映射到数据库中用于存储应用程序数据的各个表。实体集和关联集构成了编程对象模型中将由应用程序代码使用的类的基础。

实体集和关联集定义实体和关联的范围;实体容器定义用于承载实体和关联的存储容器。不存在 SimpleType 集。这些类型实例化为赋给实体的各个属性的值。

属于 EntityTypeEntitySet 包含 EntityType 的实例或其子类型的任何一个实例。可以使用同一个 EntityType 定义多个 EntitySetEntityType 的一个实例只能是一个 EntitySet 的成员。

EntitySet 中的实体实例必须满足三个条件:

  • 实体实例的类型必须为 EntitySetEntityTypeEntityType 的任何子类型。

  • 每个实体实例的值在 EntitySet 中唯一标识该实例。

  • 实体实例不是任何其他 EntitySet 的成员。

以下概念架构定义语言 (CSDL) 语法是名为 CustomerSetEntitySet 的声明。EntitySet 包含实体 CustomerType 的实例:

<EntitySet Name="CustomerSet" EntityType="CustomerType"/>

在以下架构段中,两个 EntityType 声明定义实体类型 ProductSupplier。基于 ProductSupplier 实体的实体集以复数形式分别命名为:ProductsSuppliers。这些实体集添加到 EntityContainer 的定义中。

<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns:cg="https://schemas.microsoft.com/ado/2006/04/codegeneration"
    xmlns:edm="https://schemas.microsoft.com/ado/2006/04/edm"
    xmlns="https://schemas.microsoft.com/ado/2006/04/edm"
    Namespace="MyCompany.LOBSchema" Alias="Self">

<EntityType Name="Product">
    <Key>
      <PropertyRef Name="ProductID" />
    </Key>
    <Property Name="ProductID" Type="Int32" Nullable="false" />
    <Property Name="ProductName" Type="String" Nullable="false" />
    <Property Name="UnitPrice" Type="Decimal" Nullable="true" />
    <Property Name="UnitsInStock" Type="Int16" Nullable="true" />
</EntityType>

<EntityType Name="Supplier">
    <Key>
      <PropertyRef Name="SupplierID" />
    </Key>
    <Property Name="SupplierID" Type="Int32" Nullable="false" />
    <Property Name="CompanyName" Type="String" Nullable="false" />
    <Property Name="ContactName" Type="String" Nullable="true" />
    <Property Name="HomePage" Type="String" Nullable="true" />
</EntityType>

<EntityContainer Name="LOB-Data">
    <EntitySet Name="Products" EntityType="Product" />
    <EntitySet Name="Suppliers" EntityType="Supplier" />
</EntityContainer>

</Schema>

有关实体容器的更多信息,请参见实体容器 (EDM)

每种类型多个实体集

实体数据模型 (EDM) 允许在要为同一个实体类型定义的单个实体容器或多个实体容器内使用多个实体集。通过定义每种类型多个实体集 (MEST),当数据库具有分区或其他此类情况(其中,多个表具有相同结构)时,用户可以简化其代码。

数据库出于各种原因(如性能、可用性和可管理性)而进行分区。为大量客户管理帐户的金融机构可能对其数据库系统进行分区,以便按区域分布客户数据来提高性能。当限制为数据的某个区域子集时,搜索和更新数据的速度将更快。为了实现 MEST,必须在同一个数据库中执行分区方案。如果分区涉及不同的数据库,将需要不同的连接字符串和不同的上下文,而不是 MEST 方案。

分区可能有用的另一个情形是 IT 部门需要在每天深夜备份频繁访问的数据,同时对超过一年未访问的数据进行存档。DBA 可能使用相同的表架构将超过一年未使用其帐户数据的客户存档到同一个数据库中的存档表中。

对于属于多个实体集成员的实体类型,必须考虑它们之间的关联的结构,这一点至关重要。根据经过测试的结构,最易于实现 MEST。以下方案已获得成功使用。

  • 在一对多关联中,在关联的“一”端实现为 MEST 的实体应与“多”端的两个不同实体集具有关系。例如,可以在两个实体集中使用 Customer 实体类型实现以下方案:PreferedCustomersCreditRiskCustomers

    • PreferedCustomers <1-----*> Orders

    • CreditRiskCustomers <1-----*> CreditReports

  • 在一对多关联中,“一”端的实体集可能与在“多”端实现为 MEST 的实体具有关联。例如,Product 实体可能包含在两个实体集以及与 ManufacturingUnit 实体的关联中。

    • ManufacturingUnit <1-----*> Products

    • ManufacturingUnit <1----*> DefectiveProducts

当设计逻辑模型和/或将逻辑模型映射到概念模型时,“一对一”方案或“多对多”方案中的 MEST 实现将难以成功。一对一和多对多 MEST 所面临的问题与“一”端的 MEST 和“多”端的同一个实体集具有关系所面临的问题一样。通过一对一,可以创建与一对多情形类似的逻辑模型。

  • 当设计逻辑模型时,以下订单方案将遇到问题。

    • PreferedCustomers <1-----*> Orders

    • CreditRiskCustomers <1-----*> Orders

有关更多信息,请参见如何:通过每种类型多个实体集定义模型(实体框架)

另请参见

概念

关联 (EDM)
关联集 (EDM)
实体容器 (EDM)
实体数据模型类型
简单类型 (EDM)

其他资源

架构和映射规范(实体框架)