complex type

.NET Framework (current version)

A complex type is a template for defining rich, structured properties on entity types or on other complex types. Each template contains the following:

  • A unique name. (Required)


    The name of a complex type cannot be the same as an entity type name within the same namespace.

  • Data in the form of one or more properties. (Optional.)


    A property of a complex type can be another complex type.

A complex type is similar to an entity type in that a complex type can carry a data payload in the form of primitive type properties or other complex types. However, there are some key differences between complex types and entity types:

  • Complex types do not have identities and therefore cannot exist independently. Complex types can only exist as properties on entity types or other complex types.

  • Complex types cannot participate in associations. Neither end of an association can be a complex type, and therefore navigation properties cannot be defined on complex types.

The ADO.NET Entity Framework uses a domain-specific language (DSL) called conceptual schema definition language (CSDL) to define conceptual models. The following CSDL defines a complex type, Address, with the primitive type properties StreetAddress, City, StateOrProvince, Country, and PostalCode.

<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" />

To define the complex type Address (above) as a property on an entity type, you must declare the property type in the entity type definition. The following CSDL declares the Address property as a complex type on an entity type (Publisher):

<EntityType Name="Publisher">
           <PropertyRef Name="Id" />
         <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" />