Complex Type — 复杂类型

“复杂类型”是用于定义实体类型或其他复杂类型上的丰富的结构化属性的模板。 每个模板都包含以下内容:

  • 唯一名称。 (必需)

    备注

    复杂类型的名称不能与同一命名空间中的实体类型的名称相同。

  • 数据采用一个或多个属性的形式。 (可选。)

    备注

    复杂类型的属性可以是另一个复杂类型。

复杂类型与实体类型相似,因为复杂类型可以以基元类型属性或其他复杂类型的形式携带数据负载。 但是,在复杂类型与实体类型之间仍存在着一些重要区别:

  • 复杂类型没有标识,因此不能独立存在。 复杂类型只能作为实体类型或其他复杂类型的属性而存在。

  • 复杂类型不能参与关联。 关联的任一端都不能是复杂类型,因此不能为复杂类型定义导航属性

示例

ADO.NET 实体框架使用一种称为“概念架构定义语言 (CSDL)”的特定于域的语言 (DSL) 来定义概念模型。 下面的 CSDL 定义了一个复杂类型 Address,它具有基元类型属性 StreetAddressCityStateOrProvinceCountryPostalCode

<ComplexType Name="Address" >
  <Property Type="String" Name="StreetAddress" Nullable="false" />
  <Property Type="String" Name="City" Nullable="false" />
  <Property Type="String" Name="StateOrProvince" Nullable="false" />
  <Property Type="String" Name="Country" Nullable="false" />
  <Property Type="String" Name="PostalCode" Nullable="false" />
</ComplexType>

若要将复杂类型 Address(如上所示)定义为某个实体类型的属性,必须在实体类型定义中声明该属性类型。 下面的 CSDL 将 Address 属性声明为实体类型 (Publisher) 的复杂类型:

<EntityType Name="Publisher">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Type="Int32" Name="Id" Nullable="false" />
      <Property Type="String" Name="Name" Nullable="false" />
      <Property Type="BooksModel.Address" Name="Address" Nullable="false" />
      <NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
                          FromRole="Publisher" ToRole="Book" />
    </EntityType>

请参阅