Compartir a través de


Tipos complejos

La compatibilidad de tipos complejos en WCF RIA Services proporciona un medio para encapsular un conjunto de propiedades de entidad en una sola propiedad (compleja). Estos tipos se pueden utilizar para simplificar una entidad cuando contiene un subconjunto concreto de propiedades relacionadas. Los tipos complejos pueden ser reutilizados por otra entidad (diferente) que comparte el mismo subconjunto de propiedades. Un ejemplo común de un tipo complejo es un elemento Address, que reúne las propiedades de entidad necesarias para especificar una dirección. El conjunto de propiedades de un tipo Address puede incluir, por ejemplo, las propiedades de entidad StreetAddress, City, StateProvince, PostalCode y Country. Este tipo complejo pueden utilizarlo las entidades Customer y Contact proporcionadas que comparten este conjunto de propiedades. Eso hace que, una vez definido, el tipo Address personalizado se pueda utilizar como una propiedad de entidad en otras entidades.

Un tipo complejo es una plantilla para definir propiedades estructuradas avanzadas en tipos de entidad o en otras entidades complejas, ya que un tipo complejo puede contener propiedades que son también de un tipo complejo. Un tipo complejo debe especificar un nombre que es único en su espacio de nombres y, opcionalmente, contiene datos en forma de una o más propiedades. Los tipos complejos solo pueden existir como propiedades en tipos de entidad u otros tipos complejos, ya que no tienen identidades y, por lo tanto, no pueden existir independientemente. Son tipos genuinos y, por consiguiente, se pueden crear instancias de ellos y utilizarse en código, pero no se pueden consultar directamente ni conservar en una base de datos, como sí se puede con los tipos de entidad. Los tipos complejos también se diferencian de las entidades en que no pueden participar en una asociación. De ahí que no se puedan definir propiedades de navegación en tipos complejos mientras que sí se puede realizar esta acción en tipos de entidad.

Se ha agregado compatibilidad con tipos complejos que no son de entidad en WCF RIA Services V1.0 SP1. Concretamente, se proporciona compatibilidad con la generación de código de tipos complejos que derivan de la clase base ComplexObject. La compatibilidad con la generación de proxies de clientes es igual de avanzada que la compatibilidad con entidades de RIA Services . También se proporciona compatibilidad de metadatos en el mismo nivel que entidades, como validación profunda, seguimiento de cambios, sesiones de edición y parámetros de tipo complejo. Esto significa que los tipos personalizados, como Address, se pueden utilizar ahora no solo como propiedades de entidad sino también como parámetros o como valores devueltos para métodos de servicio de dominio.

Definir y representar un tipo complejo

En este sección se describe cómo usar Entity Data Model (EDM) Designer para encapsular un conjunto de propiedades de entidad de un tipo de entidad en un tipo complejo. Entity Data Model (EDM) usa un lenguaje específico de dominio (DSL) denominado lenguaje de definición de esquemas conceptuales (CSDL) para definir los modelos conceptuales. Se examina la representación XML del tipo complejo en CSDL que subyace al diseñador.

En este tema se supone que se ha completado el tema Tutorial: crear una solución de RIA Services o que se dispone de un conocimiento equivalente y una solución de RIA Services existente.

Crear un tipo complejo con el diseñador

  1. Abra la solución RIAServicesExample obtenida de trabajar con Tutorial: crear una solución de RIA Services y abra el archivo AdventureWorksModel.edmx (que se hace de forma predeterminada) en Entity Framework Designer.

  2. Seleccione las propiedades siguientes de la entidad Address: AddressLine1, AddressLine2, City, StateProvince, CountryRegion y PostalCode.

  3. Haga clic con el botón secundario en una de ellas y seleccione Refactorizar en nuevo tipo complejo. Esto hace que se abra el Explorador de modelos, donde el tipo complejo que se acaba de crear, denominado ComplexType1 de forma predeterminada, aparece en la carpeta ComplexTypes de AdventureWorksModel.edmx. El nombre especificado en el Explorador de modelos es realmente el tipo del nuevo elemento ComplexProperty. Las subpropiedades encapsuladas por esta nueva propiedad compleja están ahora visibles en el Explorador de modelos.

  4. Seleccione ComplexType1 en el Explorador de modelos y cambie su nombre por MailAddress. Este es ahora el tipo del nuevo elemento ComplexProperty, como se puede comprobar seleccionando el elemento ComplexProperty en la entidad Address y observando el tipo en la ventana Propiedades.

  5. Cambie el Nombre del nuevo tipo MailAddress a MailAddress en la ventana Propiedades. Observe que este nuevo nombre también aparece ahora en el diseñador.

  6. Seleccione MailAddress en el diseñador, haga clic con el botón secundario y seleccione Asignaciones de tablas para obtener acceso a la tabla Detalles de la asignación. Esta tabla indica cómo se asignan las propiedades en las columnas de tabla de la base de datos.

La representación XML del tipo complejo

RIA Services usa el lenguaje de definición de esquemas conceptuales (CSDL) para especificar modelos de datos. Es un lenguaje basado en XML que describe las entidades, las relaciones y las funciones que conforman un modelo conceptual de una aplicación controlada por datos. La especificación del nuevo tipo MailAddress está en la sección CSDL del código XML.

Para tener acceso a él, seleccione AdventureWorksModel.edmx en el Explorador de soluciones, haga clic con el botón secundario y seleccione Abrir con y, a continuación, elija Editor XML (texto). Visual Studio 2010 tendrá que cerrar la Vista de diseño del modelo de datos para abrir la representación XML; por lo tanto, seleccione para aprobar esta acción. Observe que la nueva propiedad MailAddress está especificada en el elemento <EntityType Name=”Address”>:

<Property Name="MailAddress" Type="AdventureWorksLTModel.MailAddress" Nullable="false" />

La propiedad MailAddress está definida en su propio elemento debajo de las secciones donde están definidas las asociaciones.

        <ComplexType Name="MailAddress">
          <Property Type="String" Name="AddressLine1" Nullable="false" MaxLength="60" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="AddressLine2" MaxLength="60" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="City" Nullable="false" MaxLength="30" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="StateProvince" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="CountryRegion" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="PostalCode" Nullable="false" MaxLength="15" FixedLength="false" Unicode="true" />
        </ComplexType>

Observe que no hay ningún elemento <Key> dentro de un elemento <ComplexType> como sí lo hay en un elemento .

Reutilizar un tipo complejo en otra entidad

Si se tuviera un tipo de entidad Manufacturer que contuviera el mismo conjunto de propiedades de dirección, se podrían encapsular estas en el tipo complejo . Use Refactorizar en nuevo tipo complejo como ya hizo para crear el tipo complejo y, a continuación, cambie el tipo y el nombre en la ventana Propiedades. Los campos señalarán sus entidades respectivas. Por ejemplo, el campo City para el elemento MailAddress de la entidad Address se asignará a Address.City, mientras que este campo se asignará a Manufacturer.City para el tipo de entidad Manufacturer. Use la tabla Detalles de la asignación para asegurarse de que las propiedades se asignen de nuevo a las columnas correctas de la base de datos.