Compartir a través de


Tutorial: asignar la herencia de tabla por tipo

En este tema se muestra cómo implementar la herencia de tabla por tipo modificando el modelo conceptual en un Entity Data Model (EDM). La herencia de tabla por tipo utiliza una tabla independiente de la base de datos para mantener los datos de las propiedades no heredadas y de las propiedades de clave para cada tipo de la jerarquía de herencia. Para obtener más información sobre cómo implementar la herencia con un EDM, vea Herencia (EDM).

En este tutorial, implementará la herencia de tabla por tipo modificando el EDM que se usa en la aplicación CourseManager (para obtener más información, vea la sección Requisitos previos, posteriormente en este tema).

En la aplicación CourseManager, los tipos de entidad Course, OnlineCourse y OnsiteCourse se asignan a tablas homónimas. Dado que los tipos de entidad OnsiteCourse y OnlineCourse contienen información que es única para los dos tipos de curso y comparten una clave común, se pueden cambiar para heredar del tipo de entidad Course. Los pasos siguientes resumen cómo implementar la herencia de tabla por tipo en este caso (en procedimientos posteriores de este tema se proporcionan más detalles):

  1. Elimine la asociación entre el tipo de entidad OnlineCourse y el tipo de entidad Course. Elimine la asociación entre el tipo de entidad OnsiteCourse y el tipo de entidad Course. Estas asociaciones se reemplazarán al implementar la jerarquía de herencia.

  2. Elimine la propiedad de clave CourseID de los tipos de entidad OnsiteCourse y OnlineCourse. Esta propiedad se heredará del tipo de entidad Course.

  3. Establezca el tipo de entidad Course como tipo base para los tipos de entidad OnsiteCourse y OnlineCourse.

  4. Convierta el tipo de entidad Course en un tipo abstracto.

  5. Asigne las propiedades CourseID heredadas de los tipos de entidad OnsiteCourse y OnlineCourse a las columnas adecuadas.

Requisitos previos

Para completar este tutorial, primero debe generar la aplicación CourseManager. Para obtener más información e instrucciones, vea el Tutorial rápido de Entity Framework. Modificará el EDM utilizado en la aplicación CourseManager implementando la herencia de tabla por tipo. A continuación, extenderá la funcionalidad de la aplicación para mostrarse de forma separada en línea y cursos in situ para un departamento seleccionado.

Nota

Dado que muchos de los temas del tutorial de esta documentación usan la aplicación CourseManager como punto de partida, recomendamos que utilice una copia de la misma en este tutorial, en lugar de modificar el código original.

El tutorial supone que el lector tiene conocimientos básicos de Visual Studio, .NET Framework y sobre la programación con Visual C# o Visual Basic.

Implementar la herencia de tabla por tipo

En este procedimiento, modificará la parte conceptual del EDM SchoolModel para implementar la herencia de tabla por tipo.

Para implementar la herencia de tabla por tipo

  1. Abra la solución CourseManager en Visual Studio.

  2. En el Explorador de soluciones, haga doble clic en el archivo School.edmx.

    El archivo School.edmx se abre en ADO.NET Entity Data Model Designer (Entity Designer).

  3. Haga clic con el botón secundario en el tipo de entidad OnlineCourse y seleccione Propiedades.

  4. En la ventana Propiedades, establezca la propiedad Tipo base en Course.

  5. Repita los pasos 3 y 4 con el tipo de entidad OnsiteCourse.

  6. Haga clic con el botón secundario en la asociación (la línea) entre los tipos de entidad Course y OnlineCourse. Seleccione Eliminar.

  7. Haga clic con el botón secundario en la asociación entre los tipos de entidad OnsiteCourse y Course. Seleccione Eliminar.

  8. Haga clic con el botón secundario en la propiedad CourseID del tipo de entidad OnlineCourse y seleccione Eliminar.

  9. Haga clic con el botón secundario en la propiedad CourseID del tipo de entidad OnsiteCourse y seleccione Eliminar.

  10. Seleccione el tipo de entidad Course. Establezca su propiedad Abstract en true en la ventana Propiedades.

    Aparece un cuadro de mensaje que indica que al definir un tipo de entidad como abstracto, se quitarán todas las asignaciones de función existentes para ese tipo. Haga clic en Aceptar.

    Nota

    Dado que el tipo de entidad Course se ha cambiado ahora por un tipo abstracto, la funcionalidad de la actualización de la aplicación CourseManager original no funcionará.

  11. Haga clic con el botón secundario en el tipo de entidad OnlineCourse y seleccione Asignación de tabla.

    Aparece la ventana Detalles de la asignación.

  12. Haga clic en el campo Valor o propiedad que corresponde a la columna CourseID.

    El campo Valor o propiedad se convierte en una lista desplegable de propiedades que están disponibles para asignarlas a la columna correspondiente.

  13. En la lista desplegable, seleccione CourseID.

  14. Repita los pasos 11 a 13 con el tipo de entidad OnsiteCourse.

Ya está implementada la herencia de tabla por tipo.

Construir la interfaz de usuario

Luego, agregará un botón al formulario CourseViewer que carga y muestra el formulario CourseDiscrimForm. A continuación, agregará dos controles DataGridView para mostrar OnsiteCourses y OnlineCourses. Finalmente, enlazará el elemento DataGridView a los controles BindingSource. Para obtener más información sobre cómo enlazar objetos a controles, vea Enlazar objetos a controles (Entity Framework).

Para construir la interfaz de usuario

  1. Haga clic con el botón secundario en el proyecto CourseManager en el Explorador de soluciones, seleccione Agregar y seleccione Nuevo elemento.

    Aparecerá el cuadro de diálogo Agregar nuevo elemento.

  2. Seleccione Windows Forms y, a continuación, haga clic en Agregar.

    Se agrega un formulario nuevo al proyecto y se abre en el diseñador de formularios.

  3. En la ventana Propiedades, establezca el nombre del formulario en CourseDiscriminator.

    Se agrega un formulario nuevo al proyecto y se abre en el diseñador de formularios. El nombre del formulario se establece en CourseDiscriminator y el texto en CourseDiscriminator.

  4. Arrastre un control ComboBox del cuadro de herramientas al formulario y establezca su nombre en departmentList en la ventana Propiedades.

  5. Arrastre un control DataGridView del cuadro de herramientas al formulario y establezca su nombre en onsiteGridView.

  6. Arrastre otro control DataGridView del cuadro de herramientas al formulario y establezca su nombre en onlineGridView.

  7. En el Explorador de soluciones, haga doble clic en el formulario CourseViewer.cs o CourseViewer.vb.

    La vista de diseño del formulario CourseViewer aparece.

  8. Arrastre un control Button del cuadro de herramientas al formulario CourseViewer.

  9. En la ventana Propiedades, establezca el nombre del elemento Button en viewDiscriminator y establezca el texto del botón en Online vs. Onsite.

  10. Haga doble clic en el control viewDiscriminatorButton.

    Se abre el archivo de código subyacente para el formulario.

  11. Agregue el código siguiente al controlador de eventos viewDiscriminator_click:

    Dim courseDiscrim As New CourseDiscriminator
    courseDiscrim.Visible = True
    
    CourseDiscriminator courseDiscrim = new CourseDiscriminator();
    courseDiscrim.Visible = true;
    

La interfaz de usuario para este formulario está completa ahora.

Consultar el EDM

En este procedimiento, consultará el EDM y enlazará los resultados a los controles de formularios Windows Forms.

Para consultar el EDM

  1. Abra el formulario CourseDiscriminator en el diseñador de formularios.

  2. Arrastre un control BindingSource del cuadro de herramientas al formulario.

  3. En la ventana Propiedades, establezca el nombre de BindingSource en onsiteBindingSource.

  4. Haga clic en el campo situado junto a la propiedad DataSource en la ventana Propiedades.

    El campo se convierte en una lista desplegable de los orígenes de datos disponibles.

  5. Haga clic en Agregar origen de datos del proyecto.

    Se abre la ventana Elegir un tipo de origen de datos del Asistente para la configuración de orígenes de datos.

  6. En el cuadro ¿De dónde obtendrá la aplicación los datos? seleccione Objeto.

  7. Haga clic en Siguiente.

    Se abre la ventana Seleccione el objeto que desee enlazar a. Se muestra el nodo superior de un árbol de recursos disponibles.

  8. Expanda el nodo CourseManager, a continuación, expanda el nodo SchoolModel (C#) o CourseManager.SchoolModel (Visual Basic).

  9. Seleccione OnsiteCourse y haga clic en Finalizar.

  10. Repita los pasos 2 a 9, pero denomine al control BindingSourceOnlineBindingSource y enlácelo al objeto OnlineCourse.

  11. Haga clic con el botón secundario en el control OnsiteGridView y seleccione Propiedades.

  12. En la ventana Propiedades, haga clic en el campo situado junto a la propiedad DataSource.

    El campo se convierte en una lista desplegable de los orígenes de datos disponibles.

  13. Seleccione OnsiteBindingSource

  14. Repita los pasos 11 a 13 con el control OnlineGridView, pero establezca la propiedad DataSouce en OnlineBindingSource.

    Nota

    El método OfType devuelve una enumeración a partir de la que un control DataGridView no puede generar columnas en tiempo de ejecución. Para mostrar la información deseada en este ejemplo, los orígenes de datos para los controles DataGridView se establecen en tiempo de diseño a través de los controles BindingSource, según las clases a las que se desea enlazar.

  15. Haga doble clic en el formulario CourseDiscriminator.

    Se abre el archivo de código subyacente para el formulario CourseDiscriminator.

  16. Agregue las instrucciones using (C#) o Imports (Visual Basic) siguientes para hacer referencia al modelo que creó a partir de la base de datos School y el espacio de nombres de la entidad.

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  17. Agregue una propiedad que representa el contexto de los datos a la clase CourseDiscriminator:

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  18. En el controlador de eventos CourseDiscriminator_Load, agregue el código para inicializar el contexto del objeto y enlace el control departmentList a una consulta que devuelva información Department.

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Define a query that returns all Department objects and 
    ' related Course objects, ordered by name.
    Dim departmentQuery As ObjectQuery(Of Department) = _
            schoolContext.Department.Include("Course") _
            .OrderBy("it.Name")
    
    ' Bind the ComboBox control to the query, which is
    ' executed during data binding.
    departmentList.DataSource = departmentQuery _
    .Execute(MergeOption.OverwriteChanges)
    departmentList.DisplayMember = "Name"
    
        // Initialize the ObjectContext.
        schoolContext = new SchoolEntities();
    
        // Define a query that returns all Department objects  
        // and related Course objects, ordered by name.
        ObjectQuery<Department> departmentQuery =
            schoolContext.Department.Include("Course")
            .OrderBy("it.Name");
    
        // Bind the ComboBox control to the query, which is
        // executed during data binding.
        this.departmentList.DataSource = departmentQuery
    .Execute(MergeOption.OverwriteChanges);
        this.departmentList.DisplayMember = "Name";
    
  19. Vuelva a la vista del diseñador del formulario CourseDiscriminator y haga doble clic en el control departmentListComboBox.

    Se abre el archivo de código subyacente. Un controlador de eventos departmentList_SelectedIndexChanged se ha agregado al código.

  20. Agregue el código siguiente al controlador de eventos departmentList_SelectedIndexChanged para actualizar los orígenes de datos para los controles BindingSource.

    ' Get the selected department object.
    Dim department As Department = CType(Me.departmentList. _
            SelectedItem, Department)
    
    ' Update the data sources for the BindingSource controls.
    onsiteBindingSource.DataSource = department.Course _
        .OfType(Of OnsiteCourse)()
    onlineBindingSource.DataSource = department.Course _
        .OfType(Of OnlineCourse)()
    
    // Get the selected department object.
    Department department = (Department)this.departmentList
        .SelectedItem;
    
    // Update the data sources for the BindingSource controls.
    onsiteBindingSource.DataSource = department.Course
        .OfType<OnsiteCourse>();
    onlineBindingSource.DataSource = department.Course
        .OfType<OnlineCourse>();
    

La aplicación se ha completado ahora. Presione Ctrl+F5 para ejecutar la aplicación. Haga clic en el botón Onsite vs. Online para cargar el formulario CourseDiscriminator. OnsiteCourses y OnlineCourses correspondientes al departamento seleccionado se muestran en los controles DataGridView.

Códigos

Esta sección muestra la versión final del archivo de código subyacente para el formulario CourseDiscriminator.

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class CourseDiscriminator

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Private Sub CourseDiscriminator_Load(ByVal sender As System. _
        Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Initialize the ObjectContext.
        schoolContext = New SchoolEntities()

        ' Define a query that returns all Department objects and 
        ' related Course objects, ordered by name.
        Dim departmentQuery As ObjectQuery(Of Department) = _
                schoolContext.Department.Include("Course") _
                .OrderBy("it.Name")

        ' Bind the ComboBox control to the query, which is
        ' executed during data binding.
        departmentList.DataSource = departmentQuery _
        .Execute(MergeOption.OverwriteChanges)
        departmentList.DisplayMember = "Name"
    End Sub

    Private Sub departmentList_SelectedIndexChanged(ByVal sender As  _
        System.Object, ByVal e As System.EventArgs) Handles _
        departmentList.SelectedIndexChanged
        ' Get the selected department object.
        Dim department As Department = CType(Me.departmentList. _
                SelectedItem, Department)

        ' Update the data sources for the BindingSource controls.
        onsiteBindingSource.DataSource = department.Course _
            .OfType(Of OnsiteCourse)()
        onlineBindingSource.DataSource = department.Course _
            .OfType(Of OnlineCourse)()
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class CourseDiscriminator : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public CourseDiscriminator()
        {
            InitializeComponent();
        }

        private void CourseDiscriminator_Load(object sender, 
            EventArgs e)
        {
            // Initialize the ObjectContext.
            schoolContext = new SchoolEntities();

            // Define a query that returns all Department objects  
            // and related Course objects, ordered by name.
            ObjectQuery<Department> departmentQuery =
                schoolContext.Department.Include("Course")
                .OrderBy("it.Name");

            // Bind the ComboBox control to the query, which is
            // executed during data binding.
            this.departmentList.DataSource = departmentQuery
        .Execute(MergeOption.OverwriteChanges);
            this.departmentList.DisplayMember = "Name";
        }

        private void departmentList_SelectedIndexChanged(object sender, 
            EventArgs e)
        {
            // Get the selected department object.
            Department department = (Department)this.departmentList
                .SelectedItem;

            // Update the data sources for the BindingSource controls.
            onsiteBindingSource.DataSource = department.Course
                .OfType<OnsiteCourse>();
            onlineBindingSource.DataSource = department.Course
                .OfType<OnlineCourse>();
        }
    }
}

Pasos siguientes

Ha implementado correctamente la herencia de tabla por tipo en un EDM. Para obtener más información sobre cómo definir un EDM con herencia de tabla por tipo, vea Cómo definir un modelo con herencia de tabla por tipo (Entity Framework). Para obtener más información sobre cómo generar aplicaciones que utilizan Entity Framework, vea Guía de programación (Entity Framework).

Vea también

Otros recursos

Escenarios de ADO.NET Entity Data Model Designer
Tareas de herramientas de Entity Data Model