Compartir a través de


Cómo definir un modelo con un tipo complejo (Entity Framework)

El tipo complejo en el Entity Data Model (EDM) es un tipo de datos con estructura interna pero sin una propiedad clave. El tipo complejo se usa para implementar una propiedad que tenga propiedades internas propias. Tanto una entidad como un tipo complejo pueden tener declarada una propiedad como tipo complejo.

Un tipo complejo se declara con una sintaxis similar a la de un tipo de entidad. La diferencia principal es que un tipo complejo no incluye la declaración de una propiedad clave como en una entidad. En la especificación de una asignación, un tipo complejo se asigna como una propiedad compleja.

Para implementar una propiedad compleja

  1. Cree un proyecto en Visual Studio del tipo de la biblioteca de clases y agregue referencias a System.Data.Entity y a System.Runtime.Serialization.

  2. Agregue una nueva plantilla de Entity Data Model al proyecto.

  3. Implemente el esquema del lenguaje de definición de esquemas conceptuales (CSDL, Conceptual Schema Definition Language) y agréguelo al archivo de CSDL que proporciona la plantilla del EDM. El esquema incluye declaraciones de la entidad CCustomer y su propiedad Address que usa el tipo complejo CAddress. El esquema completo se muestra en el ejemplo de código siguiente.

  4. Ejecute edmgen.exe en el esquema conceptual creado en el paso 2 para crear el código del objeto.

  5. Implemente el esquema del lenguaje de definición de esquemas de almacenamiento (SSDL) y agréguelo al archivo de SSDL que proporciona la plantilla del EDM. En este esquema, los datos de los tipos complejos se almacenan en la misma tabla que la entidad que los contiene, según se muestra en los metadatos del lenguaje de definición de esquemas de almacenamiento (SSDL). El esquema completo se muestra en el ejemplo de código siguiente.

  6. Implemente el esquema del lenguaje de especificación de asignaciones (MSL, Mapping Specification Language) y agréguelo al archivo de MSL que proporciona la plantilla del EDM. En el siguiente esquema de asignación se muestra la asignación de Address como una propiedad compleja. La especificación completa de la asignación se muestra en el ejemplo de código siguiente.

Ejemplo

Los tres esquemas requeridos se muestran consecutivamente en el siguiente XML. A continuación del código, se proporciona un script que se puede utilizar para crear la base de datos que se usa para el almacenamiento en este ejemplo.

    <Schema Namespace="CustomerComplexAddress"
        Alias="Self"
        xmlns="https://schemas.microsoft.com/ado/2006/04/edm">

        <EntityContainer Name="CustomerComplexAddressContext">
          <EntitySet Name="CCustomers" EntityType="CustomerComplexAddress.CCustomer" />
        </EntityContainer>

        <EntityType Name="CCustomer">
          <Key>
            <PropertyRef Name="CustomerId" />
          </Key>
          <Property Name="CustomerId" Type="Int32" Nullable="false" />
          <Property Name="CompanyName" Type="String" />
          <Property Name="ContactName" Type="String" />
          <Property Name="ContactTitle" Type="String" />
          <Property Name="Address" Type="Self.CAddress" Nullable="false" />
        </EntityType>

        <ComplexType Name="CAddress">
          <Property Name="StreetAddress" Type="String" />
          <Property Name="City" Type="String" />
          <Property Name="Region" Type="String" />
          <Property Name="PostalCode" Type="String" />
          <Property Name="Country" Type="String" />
          <Property Name="Phone" Type="String" />
          <Property Name="Fax" Type="String" />
        </ComplexType>
    </Schema>

    <Schema Namespace="CustomerComplexAddress.Store"
        Alias="Self" Provider="System.Data.SqlClient"
        ProviderManifestToken="2005"
        xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">

        <EntityContainer Name="dbo">
          <EntitySet Name="SCustomer" EntityType="CustomerComplexAddress.Store.SCustomer" />
        </EntityContainer>

        <EntityType Name="SCustomer">
          <Key>
            <PropertyRef Name="CustomerId" />
          </Key>
          <Property Name="CustomerId" Type="int" Nullable="false" />
          <Property Name="CompanyName" Type="nvarchar" MaxLength="50" />
          <Property Name="ContactName" Type="nvarchar" MaxLength="50" />
          <Property Name="ContactTitle" Type="nvarchar" MaxLength="50" />
          <Property Name="Address" Type="nvarchar" MaxLength="50" />
          <Property Name="City" Type="nvarchar" MaxLength="50" />
          <Property Name="Region" Type="nvarchar" MaxLength="50" />
          <Property Name="PostalCode" Type="nvarchar" MaxLength="50" />
          <Property Name="Country" Type="nvarchar" MaxLength="50" />
          <Property Name="Phone" Type="nvarchar" MaxLength="50" />
          <Property Name="Fax" Type="nvarchar" MaxLength="50" />
        </EntityType>
    </Schema>

    <Mapping Space="C-S"
        xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">

        <EntityContainerMapping StorageEntityContainer="dbo"
                  CdmEntityContainer="CustomerComplexAddressContext">

          <EntitySetMapping Name="CCustomers">
            <EntityTypeMapping
                 TypeName="CustomerComplexAddress.CCustomer">
              <MappingFragment StoreEntitySet="SCustomer">
                <ScalarProperty Name="CustomerId"
                                  ColumnName="CustomerId" />
                <ScalarProperty Name="CompanyName"
                                  ColumnName="CompanyName" />
                <ScalarProperty Name="ContactName"
                                  ColumnName="ContactName" />
                <ScalarProperty Name="ContactTitle"
                                  ColumnName="ContactTitle" />
               <ComplexProperty Name="Address"
                       TypeName="CustomerComplexAddress.CAddress">
                 <ScalarProperty Name="StreetAddress"
                                  ColumnName="Address" />
                 <ScalarProperty Name="City" ColumnName="City" />
                 <ScalarProperty Name="Region" ColumnName="Region" />
                 <ScalarProperty Name="PostalCode"
                                  ColumnName="PostalCode" />
                 <ScalarProperty Name="Country" ColumnName="Country" />
                 <ScalarProperty Name="Phone" ColumnName="Phone" />
                 <ScalarProperty Name="Fax" ColumnName="Fax" />
                </ComplexProperty>
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
       </EntityContainerMapping>
    </Mapping>


The following script can be used to create
    SQL Server storage model.

USE [master]
GO

CREATE DATABASE [CustomerComplexAddress] 
GO

USE [CustomerComplexAddress]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[SCustomer]') 
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[SCustomer](
    [CustomerId] [int] NOT NULL,
     [CompanyName] [nvarchar](50) NULL,
     [ContactName] [nvarchar](50) NULL,
     [ContactTitle] [nvarchar](50) NULL,
    [Address] [nvarchar](50) NULL,
     [City] [nvarchar](50) NULL,
     [Region] [nvarchar](50) NULL,
     [PostalCode] [nvarchar](50) NULL,
     [Country] [nvarchar](50) NULL,
     [Phone] [nvarchar](50) NULL,
     [Fax] [nvarchar](50) NULL,
CONSTRAINT [PK_SCustomer] PRIMARY KEY CLUSTERED 
(
     [CustomerId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
   IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
   ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO

Vea también

Tareas

Cómo crear y ejecutar consultas de objeto con tipos complejos (Entity Framework)
Cómo agregar y modificar objetos con tipos complejos (Entity Framework)

Conceptos

Tipo complejo (EDM)