Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
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 de TPH usa una tabla de base de datos para mantener los datos de todos los tipos de entidad de una jerarquía de herencia.
En esta guía asignaremos la tabla Persona a tres tipos de entidad: Persona (el tipo base), Estudiante (deriva de Persona) e Instructor (deriva de Persona). 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 deberá escribir su propio flujo de trabajo de generación de base de datos, lo cual 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 tipo tabla por tipo concreto (TPC) y los modelos de herencia mixta son compatibles con el motor de tiempo 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.
Prerrequisitos
Para completar este tutorial, necesitará:
- Una versión reciente de Visual Studio.
- Base de datos de ejemplo de la escuela.
Configurar el proyecto
- Abra Visual Studio 2012.
- Selecciona Archivo-> Nuevo -> Proyecto
- En el panel izquierdo, haga clic en Visual C# y, a continuación, seleccione la plantilla Consola .
- Escriba TPHDBFirstSample como nombre.
- Selecciona Aceptar.
Creación de un modelo
- Haga clic con el botón derecho en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar -> Nuevo elemento.
- Seleccione Datos en el menú de la izquierda y, a continuación, seleccione ADO.NET Entity Data Model (Modelo de datos de entidad) en el panel Plantillas.
- Escriba TPHModel.edmx como nombre de archivo y, a continuación, haga clic en Agregar.
- En el cuadro de diálogo Elegir contenido de Model, seleccione Generar desde la base de datos y, a continuación, haga clic en Siguiente.
- Haga 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, escriba School 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 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
Se muestra el Diseñador de entidades, que proporciona una superficie de diseño para editar 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.
Implementar 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 Persona en la lista desplegable del tipo Base.
- Haz clic en Aceptar.
- Agregue otra nueva entidad. Escriba Student para el nombre de la entidad y seleccione Persona en la lista desplegable del tipo Base.
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 clave Ctrl-X).
- Haga clic con el botón derecho en la entidad Instructor y seleccione Pegar (o use la clave 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 clave Ctrl-X).
- Haga clic con el botón derecho en la entidad Student y seleccione Pegar(o use la clave Ctrl-V).
- Seleccione la propiedad EnrollmentDate y establezca la propiedad Nullable en falso.
- Seleccione el tipo de entidad Person . En la ventana Propiedades , establezca su propiedad Abstract en true.
- 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 <Agregar una tabla o vista> en la ventana Detalles de mapeo. 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 asignación se actualiza con asignaciones de columna predeterminadas y una opción para agregar una condición.
Haga clic en <Agregar una 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 mapeo, seleccione = de la lista desplegable.
En la columna Valor/Propiedad , escriba Instructor. El resultado final debe tener este aspecto:
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 de que se pueda usar para ambos es si una condición usa una comparación Is Null o Is Not Null.
Ahora se implementa la herencia de "tabla por jerarquía".
Utilice el modelo
Abra el archivo Program.cs donde se define el método Main . Pegue el código siguiente 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);
}
}