Compartir vía


Tipos complejos: EF Designer

En este tema se muestra cómo asignar tipos complejos con Entity Framework Designer (EF Designer) y cómo consultar las entidades que contienen propiedades de tipo complejo.

En la imagen siguiente se muestran las ventanas principales que se usan al trabajar con EF Designer.

EF Designer

Nota:

Al crear el modelo conceptual, es posible que aparezcan advertencias sobre entidades y asociaciones no asignadas en la lista de errores. Puede omitir estas advertencias, porque después de elegir generar la base de datos a partir del modelo, los errores desaparecen.

Qué es un tipo complejo

Los tipos complejos son propiedades no escalares de tipos de entidad que permiten organizar las propiedades escalares dentro de las entidades. Al igual que las entidades, los tipos complejos están compuestos de propiedades escalares u otras propiedades de tipo complejo.

Al trabajar con objetos que representan tipos complejos, tenga en cuenta lo siguiente:

  • Los tipos complejos no tienen claves y, por consiguiente, no pueden existir de forma independiente. Los tipos complejos solo pueden existir como propiedades de tipos de entidad u otros tipos complejos.
  • Los tipos complejos no pueden participar en asociaciones y no pueden contener propiedades de navegación.
  • Las propiedades de tipo complejo no pueden ser null. Una excepción **InvalidOperationException **se produce cuando se llama a dbContext.SaveChanges y se encuentra un objeto complejo null. Las propiedades escalares de objetos complejos pueden ser null.
  • Los tipos complejos no pueden heredar de otros tipos complejos.
  • Debe definir el tipo complejo como una clase
  • EF detecta cambios en los miembros de un objeto de tipo complejo cuando se llama a DbContext.DetectChanges. Entity Framework llama a DetectChanges automáticamente cuando se llama a los siguientes miembros: DbSet.Find, DbSet.Local, DbSet.Remove, DbSet.Add, DbSet.Attach, DbContext.SaveChanges, DbContext.GetValidationErrors, dbContext.Entry, DbChangeTracker.Entries.

Refactorización de las propiedades de una entidad en un nuevo tipo complejo

Si ya tiene una entidad en el modelo conceptual, puede que desee refactorizar algunas de las propiedades en una propiedad de tipo complejo.

En la superficie del diseñador, seleccione una o varias propiedades (que no sean propiedades de navegación) de una entidad y, luego, haga clic con el botón derecho del mouse y seleccione Refactorizar -> Mover a nuevo tipo complejo.

Refactor Into New Complex Type

Se agrega un nuevo tipo complejo con las propiedades seleccionadas al Explorador de modelos. Se asigna un nombre predeterminado al tipo complejo.

Una propiedad compleja del tipo que se acaba de crear reemplaza las propiedades seleccionadas. Se conservan todas las asignaciones de propiedades.

Refactor Into New Complex Type 2

Creación de un nuevo tipo complejo

También puede crear un nuevo tipo complejo que no contenga propiedades de una entidad existente.

Haga clic con el botón derecho en la carpeta Tipos complejos n el Explorador de modelos y seleccione Agregar nuevo tipo complejo…. También puede seleccionar la carpeta Tipos complejos y presionar la tecla Ins en el teclado.

Add New Complex type

Un nuevo tipo complejo se agrega a la carpeta con un nombre predeterminado. Ahora puede agregar propiedades al tipo.

Adición de propiedades a un tipo complejo

Las propiedades de un tipo complejo pueden ser tipos escalares o los tipos complejos existentes. Sin embargo, las propiedades de tipo complejo no pueden tener las referencias circulares. Por ejemplo, un tipo complejo OnsiteCourseDetails no puede tener una propiedad de tipo complejo OnsiteCourseDetails.

Puede agregar una propiedad a un tipo complejo de cualquiera de las formas enumeradas a continuación.

  • Haga clic con el botón derecho en un tipo complejo en el Explorador de modelos, elija Agregar, luego seleccione Propiedad escalar o Propiedad compleja y seleccione el tipo de propiedad deseado. También puede seleccionar un tipo complejo y, luego, presionar la tecla Ins en el teclado.

    Add Properties to Complex Type

    Se agrega una nueva propiedad al tipo complejo con un nombre predeterminado.

  • O BIEN

  • Haga clic con el botón derecho en una propiedad de entidad en la superficie de EF Designer y seleccione Copiar, luego haga clic con el botón derecho en el tipo complejo en el Explorador de modelos y seleccione Pegar.

Cambio de nombre de un tipo complejo

Al cambiar el nombre de un tipo complejo, todas las referencias al tipo se actualizan en el proyecto.

  • Haga doble clic despacio en un tipo complejo en el Explorador de modelos. El nombre se seleccionará y se abrirá en modo de edición.

  • O BIEN

  • Haga clic con el botón derecho en un tipo complejo en el Explorador de modelos y seleccione Cambiar nombre.

  • O BIEN

  • Seleccione un tipo complejo en el Explorador de modelos y presione la tecla F2.

  • O BIEN

  • Haga clic con el botón derecho en un tipo complejo en el Explorador de modelos y seleccione Propiedades. Modifique el nombre en la ventana Propiedades.

Adición de un tipo complejo existente a una entidad y asignación de sus propiedades a columnas de tabla

  1. Haga clic con el botón derecho en una entidad, seleccione Agregar nuevoy elija Propiedad compleja. Se agrega a la entidad una propiedad de tipo complejo con un nombre predeterminado. Se asigna un tipo predeterminado (que se elige entre los tipos complejos existentes) a la propiedad.

  2. Asigne el tipo deseado a la propiedad en la ventana Propiedades. Después de agregar una propiedad de tipo complejo a una entidad, debe asignar sus propiedades a las columnas de una tabla.

  3. Haga clic con el botón derecho en un tipo de entidad en la superficie de diseño o en el Explorador de modelos y seleccione Asignaciones de tablas. Las asignaciones de tablas se muestran en la ventana Detalles de la asignación.

  4. Expanda el nodo Se asigna a <Nombre de tabla>. Aparece un nodo Asignaciones de columnas.

  5. Expanda el nodo Asignaciones de columnas. Aparece una lista de todas las columnas de la tabla. Las propiedades predeterminadas (si existen) a las que se asignan las columnas se muestran debajo del encabezado Valor/Propiedad.

  6. Seleccione la columna que desea asignar y, luego, haga clic con el botón derecho en el campo correspondiente Valor/Propiedad. Se muestra una lista desplegable de todas las propiedades escalares.

  7. Seleccione la propiedad apropiada.

    Map Complex Type

  8. Repita los pasos 6 y 7 para cada columna de tabla.

Nota:

Seleccione la columna que desee asignar y, luego, haga clic en el campo Valor/Propiedad. A continuación, seleccione Eliminar en la lista desplegable.

Asignación de una importación de funciones a un tipo complejo

Las importaciones de función se basan en procedimientos almacenados. Para asignar una importación de función a un tipo complejo, las columnas devueltas por el procedimiento almacenado correspondiente deben coincidir con el número de propiedades del tipo complejo y deben tener tipos de almacenamiento compatibles con los tipos de propiedad.

  • Haga doble clic en una función importada que desee asignar a un tipo complejo.

    Function Imports

  • Rellene los valores para la nueva importación de función de la siguiente forma:

    • Especifique el procedimiento almacenado para el que va a crear una importación de funciones en el campo Nombre de procedimiento almacenado. El campo es una lista desplegable que muestra todos los procedimientos almacenados del modelo de almacenamiento.

    • Especifique el nombre de la importación de funciones en el campo Nombre de la importación de funciones.

    • Seleccione Complejo como el tipo de valor devuelto y, luego, elija el tipo de valor devuelto complejo concreto en la lista desplegable.

      Edit Function Import

  • Haga clic en OK. Se crea la entrada de importación de función en el modelo conceptual.

Personalización de la asignación de columnas para la importación de funciones

  • Haga clic con el botón derecho en la importación de funciones en el Explorador de modelos y seleccione Asignación de importación de funciones. Aparece la ventana Detalles de la asignación que muestra la asignación predeterminada de la importación de funciones. Las flechas indican las asignaciones entre los valores de columna y de propiedad. De forma predeterminada, se presupone que los nombres de columna son los mismos que los nombres de propiedad del tipo complejo. Los nombres de columna predeterminados aparecen en texto gris.
  • Si es necesario, cambie los nombres de columna para que coincidan con los nombres de columna devueltos por el procedimiento almacenado que corresponden a la importación de función.

Eliminación de un tipo complejo

Al eliminar un tipo complejo, se elimina el tipo del modelo conceptual, así como las asignaciones para todas las instancias del tipo. Sin embargo, no se actualizan las referencias al tipo. Por ejemplo, si una entidad tiene una propiedad de tipo complejo ComplexType1, y se elimina ComplexType1 en el Explorador de modelos, la propiedad de entidad correspondiente no se actualiza. El modelo no se validará porque contiene una entidad que hace referencia a un tipo complejo eliminado. Puede actualizar o eliminar referencias a los tipos complejos eliminados utilizando Entity Designer.

  • Haga clic con el botón derecho en el Explorador de modelos y seleccione Eliminar.

  • O BIEN

  • Seleccione un tipo complejo en el Explorador de modelos y presione la tecla Suprimir del teclado.

Consulta de entidades que contienen propiedades de tipo complejo

En el código siguiente se muestra cómo ejecutar una consulta que devuelve una colección de objetos de tipo entidad que contienen una propiedad de tipo complejo.

    using (SchoolEntities context = new SchoolEntities())
    {
        var courses =
            from c in context.OnsiteCourses
            order by c.Details.Time
            select c;

        foreach (var c in courses)
        {
            Console.WriteLine("Time: " + c.Details.Time);
            Console.WriteLine("Days: " + c.Details.Days);
            Console.WriteLine("Location: " + c.Details.Location);
        }
    }