Tutorial: Asignar una entidad a varias tablas (Herramientas de Entity Data Model)
En este tema se muestra cómo asignar un tipo de entidad a dos tablas modificando un modelo conceptual. 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.
En este tutorial, asignará un tipo de entidad a dos tablas modificando el modelo conceptual usado en la aplicación CourseManager (para obtener más información, vea la sección Requisitos previos, más adelante 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):
Cree un nuevo tipo de entidad, Instructor.
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 las dos tablas Person y OfficeAssignment sin crear ningún tipo de entidad Instructor. Mueva la propiedad HireDate de Person a Instructor.
Mueva las propiedades Location y Timestamp de OfficeAssignment a Instructor.
Asigne la entidad Instructor a la tabla Person con la condición HireDate Is Not Null. Asigne la columna HireDate a la propiedad HireDate.
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.
Elimine el tipo de entidad OfficeAssignment.
Requisitos previos
Para completar este tutorial, primero debe compilar la aplicación CourseManager. Para obtener más información, vea el Tutorial rápido de Entity Framework. Modificará el modelo conceptual usado 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á el contenido de CSDL y de la asignación del archivo School.edmx creando un nuevo tipo de entidad (Instructor) y asignándolo a dos tablas (Person y OfficeAssignment).
Para asignar una entidad a dos tablas
Abra la solución CourseManager en Visual Studio.
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).
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.
Escriba Instructor como Nombre de entidad y seleccione Person en la lista desplegable para el Tipo base.
Haga clic en Aceptar.
Se crea y se muestra un nuevo tipo de entidad en la superficie de diseño.
Haga clic con el botón secundario en la propiedad HireDate del tipo de entidad Person (en Propiedades escalares) y seleccione Cortar.
Haga clic con el botón secundario en Propiedades escalares del tipo de entidad Instructor y seleccione Pegar.
Haga clic con el botón secundario en la propiedad HireDate y seleccione Propiedades.
La ventana Propiedades aparece.
En la ventana Propiedades, establezca la propiedad Nullable en false.
Haga clic con el botón secundario en la propiedad Location del tipo de entidad OfficeAssignment y seleccione Cortar.
Haga clic con el botón secundario en Propiedades escalares del tipo de entidad Instructor y seleccione Pegar.
Haga clic con el botón secundario en la propiedad Location y seleccione Propiedades.
En la ventana Propiedades, establezca la propiedad Nullable en false.
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. 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.
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.
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.
En la lista desplegable, seleccione HireDate.
En la columna Operador de la ventana Detalles de la asignación, seleccione Es en la lista desplegable.
En la columna Propiedad/Valor de la ventana Detalles de la asignación, seleccione No NULL.
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.
Haga clic en el campo Propiedad o valor que corresponde a la columna InstructorID y seleccione PersonID en la lista desplegable.
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
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.
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.
Arrastre un control DataGridView al formulario y establezca su nombre en officeGridView.
Haga clic en la etiqueta inteligente de DataGridView y desactive las opciones Habilitar acción de agregar y Habilitar eliminación.
Arrastre un control Button hasta el formulario y establezca su propiedad de nombre en saveChanges y su propiedad de texto a Update.
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.
Arrastre un control Button del cuadro de herramientas al formulario CourseViewer.
En la ventana Propiedades, establezca el nombre del botón en viewOffices y establezca el texto del botón en View Offices.
Haga doble clic en el control viewOffices Button.
El archivo de código subyacente para CourseViewer se abre.
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 modelo conceptual
Esta aplicación muestra los datos enlazando un control DataGridView a una consulta. 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 Binding Objects to Controls (Entity Framework).
Para consultar el modelo conceptual
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.
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;
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;
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.People.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 officeGridView.Columns("StudentGrades").Visible = False officeGridView.Columns("Courses").Visible = False
schoolContext = new SchoolEntities(); // Get Persons of type Instructor. ObjectQuery<Instructor> instructorQuery = schoolContext .People.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; officeGridView.Columns["StudentGrades"].Visible = false; officeGridView.Columns["Courses"].Visible = false;
Vuelva a la vista de diseño del formulario OfficeAssignment y haga doble clic en el control saveChanges Button.
El controlador de eventos saveChanges_Click se crea en el código subyacente del archivo.
Agregue código al controlador de eventos para guardar los cambios que se realizaron en el control DataGridView en la base de datos.
' Save object changes to the database, ' display a message, and refresh the form. schoolContext.SaveChanges() MessageBox.Show("Change(s) saved to the database.") Me.Refresh()
// Save object changes to the database, // display a message, and refresh the form. schoolContext.SaveChanges(); MessageBox.Show("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.People.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
officeGridView.Columns("StudentGrades").Visible = False
officeGridView.Columns("Courses").Visible = False
End Sub
Private Sub saveChanges_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles saveChanges.Click
' Save object changes to the database,
' display a message, and refresh the form.
schoolContext.SaveChanges()
MessageBox.Show("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
.People.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;
officeGridView.Columns["StudentGrades"].Visible = false;
officeGridView.Columns["Courses"].Visible = false;
}
private void saveChanges_Click(object sender, EventArgs e)
{
// Save object changes to the database,
// display a message, and refresh the form.
schoolContext.SaveChanges();
MessageBox.Show("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 How to: Define a Model with a Single Entity Mapped to Two Tables. Para obtener más información sobre cómo compilar aplicaciones que utilizan Entity Framework, vea ADO.NET Entity Framework.
Vea también
Otros recursos
Escenarios de las herramientas de Entity Data Model
Tareas de herramientas de Entity Data Model