Compartir a través de


Tutorial: asignar una entidad a varias tablas

En este tema se muestra cómo asignar un tipo de entidad a dos tablas modificando el modelo conceptual en un Entity Data Model (EDM). Puede asignar una entidad a varias tablas cuando estas comparten una clave común. Los conceptos que se aplican en la asignación de un tipo de entidad a dos tablas se extienden con facilidad a la asignación de un tipo de entidad a más de dos tablas. Para obtener más información sobre cómo asignar una entidad a varias tablas, vea Cómo definir un modelo con una única entidad asignada a dos tablas.

En este tutorial, asignará un tipo de entidad a dos tablas modificando el EDM utilizado en la aplicación CourseManager (para obtener más información, consulte la sección Requisitos previos, posteriormente en este tema). Creará un nuevo tipo de entidad (Instructor, derivado del tipo de entidad Person ) y lo asignará a las tablas Person y OfficeAssignment. Los pasos siguientes resumen el proceso (los procedimientos posteriores en este documento proporcionan más detalles):

  1. Cree un nuevo tipo de entidad, Instructor.

  2. Establezca el tipo base para Instructor en Person.

    Nota

    No tiene que crear una jerarquía de herencia para asignar un tipo de entidad a varias tablas. En este ejemplo se usa una jerarquía de herencia para hacerlo más realista (en uns escuela, solo un instructor tendría asignada una oficina). Sería posible asignar el tipo de entidad Person a ambas tablas Person y OfficeAssignment sin crear un tipo de entidad Instructor.

  3. Mueva la propiedad HireDate de Person a Instructor.

  4. Mueva la propiedad Location de OfficeAssignment a Instructor.

  5. Asigne la entidad Instructor a la tabla Person con la condición HireDate Is Not Null. Asigne la columna HireDate a la propiedad HireDate.

  6. Asigne la entidad Instructor a la tabla OfficeAssignment sin ninguna condición. Asigne la columna InstructorID a la propiedad PersonID y la columna Location a la propiedad Location.

  7. Elimine el tipo de entidad OfficeAssignment.

Requisitos previos

Para completar este tutorial, primero debe generar la aplicación CourseManager. Para obtener más información, vea el Tutorial rápido de Entity Framework. Modificará el EDM utilizado en la aplicación CourseManager agregando un nuevo tipo de entidad y asignándolo a dos tablas. A continuación, extenderá la funcionalidad de la aplicación para mostrar las asignaciones de oficina de los instructores.

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 lugar de modificar el código original.

Este 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.

Asignar una entidad a dos tablas

En este procedimiento, modificará la parte conceptual del EDM SchoolModel creando un nuevo tipo de entidad (Instructor) y asignándolo a dos tablas (Person y OfficeAssignment).

Para asignar una entidad a dos tablas

  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 Entity Data Model Designer (Entity Designer).

  3. Haga clic con el botón secundario en un área vacía de la superficie de diseño de Entity Designer, seleccione Agregar y, a continuación, haga clic en Entity.

    Aparece el cuadro de diálogo Nueva entidad.

  4. Escriba Instructor como Nombre de entidad y seleccione Person en la lista desplegable para el Tipo base.

  5. Haga clic en Aceptar.

    Se crea y se muestra un nuevo tipo de entidad en la superficie de diseño.

  6. Haga clic con el botón secundario en la propiedad HireDate del tipo de entidad Person (en Propiedades escalares) y seleccione Cortar.

  7. Haga clic con el botón secundario en Propiedades escalares del tipo de entidad Instructor y seleccione Pegar.

  8. Haga clic con el botón secundario en la propiedad HireDate y seleccione Propiedades.

    La ventana Propiedades aparece.

  9. En la ventana Propiedades, establezca la propiedad Nullable en false.

  10. Haga clic con el botón secundario en la propiedad Location del tipo de entidad OfficeAssignment y seleccione Cortar.

  11. Haga clic con el botón secundario en Propiedades escalares del tipo de entidad Instructor y seleccione Pegar.

  12. Haga clic con el botón secundario en la propiedad Location y seleccione Propiedades.

  13. En la ventana Propiedades, establezca la propiedad Nullable en false.

  14. Repita los pasos 10 al 13 con la propiedad Timestamp del tipo OfficeAssignment.

    Nota

    Los pasos siguientes requieren la ventana Detalles de la asignación. Si no puede ver esta ventana, haga clic con el botón secundario en la superficie de diseño principal y seleccione Detalles de la asignación.

  15. Seleccione el tipo de entidad Instructor y haga clic en <Agregar 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.

  16. En la lista desplegable, seleccione Person.

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

  17. 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.

  18. En la lista desplegable, seleccione HireDate.

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

  20. En la columna Propiedad/Valor de la ventana Detalles de la asignación, seleccione No NULL.

  21. Haga clic en <Agregar una tabla o vista> y seleccione OfficeAssignment en la lista desplegable.

    La ventana Detalles de la asignación se actualiza con la asignación de columnas predeterminada.

  22. Haga clic en el campo Propiedad o valor que corresponde a la columna InstructorID y seleccione PersonID en la lista desplegable.

  23. Haga clic con el botón secundario en el tipo de entidad OfficeAssignment y seleccione Eliminar.

El tipo de entidad Instructor está asignado ahora a las tablas Person y OfficeAssignment.

Construir la interfaz de usuario

Luego, agregará un botón al formulario CourseViewer que carga y muestra el formulario CourseAssignmentForm. A continuación, agregará un control DataGridView al formulario para mostrar las ubicaciones de la oficina Instructor. Finalmente, agregará un botón a CourseAssignmentForm que guarda las actualizaciones en la base de datos.

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, establezca el nombre del formulario en OfficeAssignment.vb u OfficeAssignment.cs, y haga clic en Agregar.

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

  3. Arrastre un control DataGridView al formulario y establezca su nombre en officeGridView.

  4. Haga clic en la etiqueta inteligente de DataGridView y desactive las opciones Habilitar acción de agregar y Habilitar eliminación.

  5. Arrastre un control Button hasta el formulario y establezca su propiedad de nombre en saveChanges y su propiedad de texto a Update.

  6. 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.

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

  8. En la ventana Propiedades, establezca el nombre del botón en viewOffices y establezca el texto del botón en View Offices.

  9. Haga doble clic en el control viewOfficesButton.

    El archivo de código subyacente para CourseViewer se abre.

  10. Agregue el código siguiente al controlador de eventos viewOffices_click:

    Dim officeForm As New OfficeAssignment()
    officeForm.Visible = True
    
    OfficeAssignment officeForm = new OfficeAssignment();
    officeForm.Visible = true;
    

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

Consultar el EDM

Esta aplicación muestra los datos enlazando un control DataGridView al EDM de SchoolModel. La información mostrada en el control DataGridView se puede modificar y los cambios pueden guardarse en la base de datos. Para obtener más información sobre cómo enlazar objetos a controles, vea Enlazar objetos a controles (Entity Framework).

Para consultar el EDM

  1. Con el formulario OfficeAssignment abierto en el diseñador de formularios, haga doble clic en el cuerpo del formulario.

    El archivo de código subyacente para el formulario OfficeAssignment se abre.

  2. 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;
    
  3. Agregue una propiedad que representa el contexto de los datos a la clase OfficeAssignment:

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. En el controlador de eventos OfficeAssignment_Load, agregue el código para inicializar el contexto del objeto y enlazar el control DataGridView a una consulta que devuelve información Instructor.

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Get Persons of type Instructor.
    Dim instructorQuery As ObjectQuery(Of Instructor) = _
        schoolContext.Person.OfType(Of Instructor)()
    
    ' Bind the query results to the GridView control.
    ' Display only location and name.
    officeGridView.DataSource = instructorQuery _
        .Execute(MergeOption.OverwriteChanges)
    officeGridView.Columns("HireDate").Visible = False
    officeGridView.Columns("PersonID").Visible = False
    officeGridView.Columns("Timestamp").Visible = False
    officeGridView.Columns("EnrollmentDate").Visible = False
    
    schoolContext = new SchoolEntities();
    
    // Get Persons of type Instructor.
    ObjectQuery<Instructor> instructorQuery = schoolContext
        .Person.OfType<Instructor>();
    
    // Bind the query results to the GridView control.
    // Display only location and name.
    officeGridView.DataSource = instructorQuery
        .Execute(MergeOption.OverwriteChanges);
    officeGridView.Columns["HireDate"].Visible = false;
    officeGridView.Columns["Timestamp"].Visible = false;
    officeGridView.Columns["PersonID"].Visible = false;
    officeGridView.Columns["EnrollmentDate"].Visible = false;
    
  5. Vuelva a la vista de diseño del formulario OfficeAssignment y haga doble clic en el control saveChangesButton.

    El controlador de eventos saveChanges_Click se crea en el código subyacente del archivo.

  6. Agregue código al controlador de eventos para guardar los cambios que se realizaron en el control DataGridView en la base de datos.

    Dim numChanges As Integer
    
    ' Save object changes to the database, display a message,
    ' and refresh the form.
    numChanges = schoolContext.SaveChanges()
    MessageBox.Show(numChanges.ToString() + _
                    " change(s) saved to the database.")
    Me.Refresh()
    
    int numChanges;
    // Save object changes to the database, display a message,
    // and refresh the form.
    numChanges = schoolContext.SaveChanges();
    MessageBox.Show(numChanges.ToString() +
        " change(s) saved to the database.");
    this.Refresh();
    

La aplicación se ha completado ahora. Presione Ctrl+F5 para ejecutar la aplicación. Haga clic en el botón View Offices para cargar el formulario OfficeAssignments. Se muestra el nombre de los instructores y la ubicación de las oficinas. Se puede modificar la información mostrada y se pueden guardar los cambios en la base de datos haciendo clic en el botón Update.

Códigos

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

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class OfficeAssignment
    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

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

        ' Get Persons of type Instructor.
        Dim instructorQuery As ObjectQuery(Of Instructor) = _
            schoolContext.Person.OfType(Of Instructor)()

        ' Bind the query results to the GridView control.
        ' Display only location and name.
        officeGridView.DataSource = instructorQuery _
            .Execute(MergeOption.OverwriteChanges)
        officeGridView.Columns("HireDate").Visible = False
        officeGridView.Columns("PersonID").Visible = False
        officeGridView.Columns("Timestamp").Visible = False
        officeGridView.Columns("EnrollmentDate").Visible = False
    End Sub

    Private Sub saveChanges_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles saveChanges.Click
        Dim numChanges As Integer

        ' Save object changes to the database, display a message,
        ' and refresh the form.
        numChanges = schoolContext.SaveChanges()
        MessageBox.Show(numChanges.ToString() + _
                        " change(s) saved to the database.")
        Me.Refresh()
    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 OfficeAssignment : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public OfficeAssignment()
        {
            InitializeComponent();
        }

        private void OfficeAssignment_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();

            // Get Persons of type Instructor.
            ObjectQuery<Instructor> instructorQuery = schoolContext
                .Person.OfType<Instructor>();

            // Bind the query results to the GridView control.
            // Display only location and name.
            officeGridView.DataSource = instructorQuery
                .Execute(MergeOption.OverwriteChanges);
            officeGridView.Columns["HireDate"].Visible = false;
            officeGridView.Columns["Timestamp"].Visible = false;
            officeGridView.Columns["PersonID"].Visible = false;
            officeGridView.Columns["EnrollmentDate"].Visible = false;
        }

        private void saveChanges_Click(object sender, EventArgs e)
        {
            int numChanges;
            // Save object changes to the database, display a message,
            // and refresh the form.
            numChanges = schoolContext.SaveChanges();
            MessageBox.Show(numChanges.ToString() +
                " change(s) saved to the database.");
            this.Refresh();
        }
    }
}

Pasos siguientes

Ha asignado correctamente una entidad a varias tablas. Para obtener más información sobre cómo crear un modelo con una entidad asignada a varias tablas, vea Cómo definir un modelo con una única entidad asignada a dos tablas. 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