Herencia de TPH del diseñador

En este tutorial paso a paso se muestra cómo implementar la herencia de tabla por jerarquía (TPH) en el modelo conceptual con Entity Framework Designer (EF Designer). La herencia TPH utiliza una tabla de base de datos para mantener los datos de todos los tipos de entidad de una jerarquía de herencia.

En este tutorial asignaremos la tabla Person a tres tipos de entidad: Person (el tipo base), Student (deriva de Person) e Instructor (se deriva de Person). Crearemos un modelo conceptual a partir de la base de datos (Database First) y, a continuación, modificaremos el modelo para implementar la herencia de TPH mediante EF Designer.

Es posible asignar a una herencia de TPH mediante Model First, pero tendría que escribir su propio flujo de trabajo de generación de base de datos que es complejo. A continuación, asignaría este flujo de trabajo a la propiedad Flujo de trabajo de generación de base de datos en ef Designer. Una alternativa más sencilla es usar Code First.

Otras opciones de herencia

Table-per-Type (TPT) es otro tipo de herencia en el que las tablas independientes de la base de datos se asignan a entidades que participan en la herencia.  Para obtener información sobre cómo asignar la herencia de tabla por tipo con EF Designer, consulte Herencia de TPT de EF Designer.

La herencia de tipos de tabla por concreto (TPC) y los modelos de herencia mixta son compatibles con el entorno de ejecución de Entity Framework, pero no son compatibles con EF Designer. Si desea usar TPC o herencia mixta, tiene dos opciones: usar Code First o editar manualmente el archivo EDMX. Si decide trabajar con el archivo EDMX, la ventana Detalles de asignación se colocará en "modo seguro" y no podrá usar el diseñador para cambiar las asignaciones.

Requisitos previos

Para completar este tutorial, necesitará:

Configuración del proyecto

  • Abra Visual Studio 2012.
  • Seleccione Archivo>, Nuevo, >Proyecto
  • En el panel izquierdo, haga clic en Visual C#y, luego, seleccione la plantilla Consola.
  • Escriba TPHDBFirstSample como nombre.
  • Seleccione Aceptar.

Creación de un modelo

  • Haga clic con el botón derecho del ratón en el nombre del proyecto en el Explorador de soluciones y seleccione Añadir - >Nuevo elemento.
  • Seleccione Datos en el menú de la izquierda y, a continuación, seleccione Modelo de datos de entidad ADO.NET en el panel Plantillas.
  • Escriba TPHModel.edmx como nombre de archivo y, luego, haga clic en Agregar.
  • En el cuadro de diálogo Elegir contenido del modelo, seleccione Generar desde la base de datos y, luego, haga clic en Siguiente.
  • Hacer clic en Nueva conexión. En el cuadro de diálogo Propiedades de conexión, escriba el nombre del servidor (por ejemplo, (localdb)\mssqllocaldb ), seleccione el método de autenticación, escribaSchool para el nombre de la base de datos y, a continuación, haga clic en Aceptar. El cuadro de diálogo Elegir la conexión de datos se actualiza con la configuración de la conexión de la base de datos.
  • En el cuadro de diálogo Elegir los objetos de base de datos, en el nodo Tablas, seleccione la tabla Persona.
  • Haga clic en Finalizar

Inicia Entity Designer, que proporciona una superficie de diseño para modificar el modelo. Todos los objetos seleccionados en el cuadro de diálogo Elegir objetos de base de datos se agregan al modelo.

Así es como se ve la tabla Person en la base de datos.

Person Table 

Implementación de la herencia de tabla por jerarquía

La tabla Person tiene la columna Discriminador, que puede tener uno de los dos valores: "Student" y "Instructor". Según el valor, la tabla Person se asignará a la entidad Student o a la entidad Instructor. La tabla Person también tiene dos columnas, HireDate e EnrollmentDate, que deben ser nullables porque una persona no puede ser un alumno y un instructor al mismo tiempo (al menos no en este tutorial).

Agregar nuevas entidades

  • Agregue una nueva entidad. Para ello, haga clic con el botón derecho en un espacio vacío de la superficie de diseño del Diseñador de Entity Framework y seleccione Agregar entidad>.
  • Escriba Instructor para el nombre de la Entidad y seleccione Person en la lista desplegable para el tipo de Base.
  • Haga clic en OK.
  • Agregue otra entrada nueva. Escriba Student para el nombre de la entidad y seleccione Persona en la lista desplegable del tipoBase.

Se agregaron dos nuevos tipos de entidad a la superficie de diseño. Una flecha apunta desde los nuevos tipos de entidad al tipo de entidad Person ; esto indica que Person es el tipo base para los nuevos tipos de entidad.

  • Haga clic con el botón derecho en la propiedad HireDate de la entidad Person. Seleccione Cortar (o use la tecla Ctrl-X).
  • Haga clic con el botón derecho en la entidad Instructor y seleccione Pegar (o use la tecla Ctrl-V).
  • Haga clic con el botón derecho en la propiedad HireDate y seleccione Propiedades.
  • En la ventana Propiedades, establezca la propiedad Nullable en False.
  • Haga clic con el botón derecho en la propiedad EnrollmentDate de la entidad Person. Seleccione Cortar (o use la tecla Ctrl-X).
  • Haga clic con el botón derecho en la entidad Student y seleccione Pegar(o use la tecla Ctrl-V).
  • Seleccione la propiedad EnrollmentDate y establezca la propiedad Que acepta valores NULL enfalse.
  • Seleccione el tipo de entidad Person. En la ventana Propiedades, establezca su propiedad Abstracto en verdadero.
  • Elimine la propiedad Discriminator de Person. La razón por la que se debe eliminar se explica en la sección siguiente.

Asignar las entidades

  • Haga clic con el botón derecho en instructor y seleccione Asignación de tablas. La entidad Instructor está seleccionada en la ventana Detalles de asignación.

  • Haga clic en <Añadir una tabla o vista> en la ventana Detalles de la asignación. El campo <Agregar una tabla o vista> se convierte en una lista desplegable de tablas o vistas a las que se puede asignar la entidad seleccionada.

  • Seleccione Persona en la lista desplegable.

  • La ventana Detalles de la asignación se actualiza con las asignaciones de columnas predeterminadas y una opción para agregar una condición.

  • Haga clic en <Agregar condición>. El campo <Agregar una condición> se convierte en una lista desplegable de columnas para las que se pueden establecer condiciones.

  • Seleccione Discriminador en la lista desplegable.

  • En la columna Operador de la ventana Detalles de la asignación, seleccione Es en la lista desplegable.

  • En la columna Valor/Propiedad, escriba Instructor. El resultado final debe tener este aspecto:

    Mapping Details

  • Repita estos pasos para el tipo de entidad Student, pero haga que la condición sea igual al valor student.
    La razón por la que queríamos quitar la propiedad Discriminador es porque no se puede asignar una columna de tabla más de una vez. Esta columna se usará para la asignación condicional, por lo que tampoco se puede usar para la asignación de propiedades. La única manera en que se puede usar para ambos, si una condición usa una comparación Is Null o Is Not Null.

Ahora se implementa la herencia de tabla por jerarquía.

Final TPH

Uso del modelo

Abra el archivo Program.cs donde se define el método Main. Pegue el siguiente código en la función Main. El código ejecuta tres consultas. La primera consulta devuelve todos los objetos Person. La segunda consulta usa el método OfType para devolver objetos Instructor. La tercera consulta usa el método OfType para devolver objetos Student.

    using (var context = new SchoolEntities())
    {
        Console.WriteLine("All people:");
        foreach (var person in context.People)
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }

        Console.WriteLine("Instructors only: ");
        foreach (var person in context.People.OfType<Instructor>())
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }

        Console.WriteLine("Students only: ");
        foreach (var person in context.People.OfType<Student>())
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }
    }