Tutorial: Recuperar tipos de entidad con un procedimiento almacenado (Herramientas de Entity Data Model)

En este tema se muestra cómo utilizar un procedimiento almacenado para recuperar una colección de tipos de entidad. En este tutorial usará ADO.NET Entity Data Model Designer (Entity Designer) para importar un procedimiento almacenado y crear una importación de función que devuelve una colección de tipos de entidad.

La inclusión de un procedimiento almacenado en el modelo conceptual permite llamar al procedimiento almacenado desde el código de la aplicación. El proceso que agrega un procedimiento almacenado al modelo conceptual se denomina importación de función. Una importación de función puede devolver colecciones de tipos simples, tipos complejos, tipos de entidad o ningún valor.

Cc716672.note(es-es,VS.100).gifNota:
Para que una importación de función devuelva un elemento EntityType, las columnas que devuelve el procedimiento almacenado correspondiente deben coincidir exactamente con las propiedades escalares del elemento EntityType devuelto.

Cuando el Asistente para Entity Data Model genera un archivo .edmx a partir de una base de datos, crea entradas en el modelo de almacenamiento para cada procedimiento almacenado en la base de datos. Las entradas correspondientes se agregan al modelo conceptual cuando se crea una importación de función. Para obtener más información sobre cómo crear una importación de función, vea Cómo: Importar un procedimiento almacenado (Herramientas de Entity Data Model).

Requisitos previos

Para completar este tutorial, debe compilar la aplicación CourseManager. Para obtener más información e instrucciones, vea el Tutorial rápido de Entity Framework. Después de compilar esta aplicación, modificará su modelo conceptual creando una importación de función basada en el procedimiento almacenado GetStudentGrades.

Cc716672.note(es-es,VS.100).gifNota:
Dado que muchos de los temas de tutoriales 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 de CourseManager.

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

Crear una importación de función

En este procedimiento creará una importación de función basada en el procedimiento almacenado GetStudentGrades incluido en el modelo de almacenamiento de la aplicación CourseManager.

Para crear una importación de función

  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) y también se abre la ventana Explorador de modelos.

  3. Expanda el nodo EntityContainer: SchoolEntities en la ventana Explorador de modelos.

    Las carpetas Conjuntos de entidades, Conjuntos de asociaciones e Importaciones de funciones son visibles en la vista de árbol.

  4. Haga clic con el botón secundario en Importaciones de funciones y seleccione Agregar importación de función.

    Se abre el cuadro de diálogo Add Function Import.

  5. Seleccione GetStudentGrades en la lista desplegable Nombre de procedimiento almacenado.

  6. Escriba GetStudentGrades en el cuadro de texto Nombre de importación de función.

  7. Seleccione Entidades como valor devuelto y, a continuación, seleccione StudentGrade en la lista desplegable correspondiente.

    Cc716672.note(es-es,VS.100).gifNota:
    Podemos establecer el tipo de valor devuelto en StudentGrade porque las columnas que son devueltas por el procedimiento almacenado GetStudentGrades (EnrollementID, StudentID, CourseID y Grade) coinciden exactamente con las propiedades escalares del tipo de entidad StudentGrade.

  8. Haga clic en Aceptar.

    La Function Import GetStudentGrades se agrega al modelo conceptual.

Construir la interfaz de usuario

En este procedimiento agregará un nuevo formulario a la interfaz de usuario de la aplicación CourseManager para que se puedan ver las notas de un alumno seleccionado.

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 GradeViewer.vb o GradeViewer.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 GradeViewer y el texto en GradeViewer.

  3. Arrastre un control ComboBox del cuadro de herramientas al formulario y establezca su Nombre en studentList en la ventana Propiedades.

  4. Arrastre un control DataGridView del cuadro de herramientas al formulario y establezca su Nombre en gradeGridView en la ventana Propiedades.

  5. Haga doble clic en el archivo CourseViewer.vb o CourseViewer.cs en el Explorador de soluciones.

    El archivo se abre en el diseñador de formulario.

  6. Arrastre un control Button al formulario. Establezca el valor de Nombre en viewGrades y el de Texto en View Grades.

  7. Haga doble clic en el control viewGrades Button.

    El controlador de eventos viewGrades_Click se agrega al archivo de código subyacente.

  8. Agregue el código siguiente al controlador de eventos viewGrades_Click:

    Dim gradeViewer As New GradeViewer()
    gradeViewer.Visible = True
    
    GradeViewer gradeViewer = new GradeViewer();
    gradeViewer.Visible = true;
    

La interfaz de usuario está completa ahora.

Recuperar tipos de entidad con un procedimiento almacenado

En este procedimiento agregará código que ejecuta la importación de función que creó previamente a partir del procedimiento almacenado GetStudentGrades. El código enlaza después la colección EntityType devuelta a un control DataGridView. Para obtener más información sobre cómo enlazar objetos a controles, vea Binding Objects to Controls (Entity Framework).

Para recuperar tipos de entidad con un procedimiento almacenado

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

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

  2. Agregue las instrucciones using (C#) o Imports (Visual Basic) siguientes:

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. Agregue una propiedad a la clase GradeViewer que representa el contexto del objeto:

    ' 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 GradeViewer_Load, agregue el código siguiente. Este código inicializa el contexto del objeto y establece el origen de datos para el control ComboBox en una consulta que devuelve todos los tipos Person que no tienen null en EnrollmentDate.

    ' Initialize schoolContext.
    schoolContext = New SchoolEntities()
    
    ' Define the query to retrieve students.
    Dim studentQuery As ObjectQuery(Of Person) = schoolContext _
        .People.Where("it.EnrollmentDate is not null") _
        .OrderBy("it.LastName")
    
    ' Execute and bind the studentList control to the query.
    studentList.DataSource = studentQuery _
        .Execute(MergeOption.OverwriteChanges)
    studentList.DisplayMember = "LastName"
    
    schoolContext = new SchoolEntities();
    
    // Define the query to retrieve students.
    ObjectQuery<Person> studentQuery = schoolContext.People
        .Where("it.EnrollmentDate is not null")
        .OrderBy("it.LastName");
    
    // Execute and bind the studentList control to the query.
    studentList.DataSource = studentQuery
        .Execute(MergeOption.OverwriteChanges);
    studentList.DisplayMember = "LastName";
    
  5. Vuelva a la vista de diseño del formulario GradeViewer y haga doble clic en el control studentList ComboBox.

    El controlador de eventos studentList_SelectedIndexChanged se agrega al archivo de código subyacente.

  6. Agregue el código siguiente al controlador de eventos studentList_SelectedIndexChanged. Este código ejecuta el GetStudentGradesFunctionImport y enlaza los resultados al control DataGridView cuando un alumno nuevo se selecciona en la lista desplegable.

    ' Get the selected student so we can use the
    ' PersonID in the function import call.
    Dim currentStudent As Person = CType(Me.studentList _
        .SelectedItem(), Person)
    
    ' Set the data source for the gradeGridView
    ' to the results returned by the GetStudentGrades
    ' Function Import.
    gradeGridView.DataSource = schoolContext _
        .GetStudentGrades(currentStudent.PersonID)
    gradeGridView.Columns("Course").Visible = False
    gradeGridView.Columns("StudentID").Visible = False
    gradeGridView.Columns("Person").Visible = False
    gradeGridView.Columns("EnrollmentID").Visible = False
    gradeGridView.AllowUserToAddRows = False
    gradeGridView.AllowUserToDeleteRows = False
    
    // Get the selected student so we can use the
    // PersonID in the function import call.
    Person currentStudent = (Person)this.studentList
        .SelectedItem;
    
    // Set the data source for the gradeGridView
    // to the results returned by the GetStudentGrades
    // Function Import.
    gradeGridView.DataSource = schoolContext
        .GetStudentGrades(currentStudent.PersonID);
    gradeGridView.Columns["Course"].Visible = false;
    gradeGridView.Columns["StudentID"].Visible = false;
    gradeGridView.Columns["Person"].Visible = false;
    gradeGridView.Columns["EnrollmentID"].Visible = false;
    gradeGridView.AllowUserToAddRows = false;
    gradeGridView.AllowUserToDeleteRows = false;
    

Presione Ctrl + F5 para ejecutar la aplicación. Ahora puede ver información de las notas del alumno haciendo clic en View Grades y seleccionando un alumno en la lista desplegable en el formulario Grade Viewer.

Códigos

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

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

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

        ' Define the query to retrieve students.
        Dim studentQuery As ObjectQuery(Of Person) = schoolContext _
            .People.Where("it.EnrollmentDate is not null") _
            .OrderBy("it.LastName")

        ' Execute and bind the studentList control to the query.
        studentList.DataSource = studentQuery _
            .Execute(MergeOption.OverwriteChanges)
        studentList.DisplayMember = "LastName"
    End Sub

    Private Sub studentList_SelectedIndexChanged(ByVal sender As  _
        System.Object, ByVal e As System.EventArgs) Handles _
        studentList.SelectedIndexChanged
        ' Get the selected student so we can use the
        ' PersonID in the function import call.
        Dim currentStudent As Person = CType(Me.studentList _
            .SelectedItem(), Person)

        ' Set the data source for the gradeGridView
        ' to the results returned by the GetStudentGrades
        ' Function Import.
        gradeGridView.DataSource = schoolContext _
            .GetStudentGrades(currentStudent.PersonID)
        gradeGridView.Columns("Course").Visible = False
        gradeGridView.Columns("StudentID").Visible = False
        gradeGridView.Columns("Person").Visible = False
        gradeGridView.Columns("EnrollmentID").Visible = False
        gradeGridView.AllowUserToAddRows = False
        gradeGridView.AllowUserToDeleteRows = False
    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 GradeViewer : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public GradeViewer()
        {
            InitializeComponent();
        }

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

            // Define the query to retrieve students.
            ObjectQuery<Person> studentQuery = schoolContext.People
                .Where("it.EnrollmentDate is not null")
                .OrderBy("it.LastName");

            // Execute and bind the studentList control to the query.
            studentList.DataSource = studentQuery
                .Execute(MergeOption.OverwriteChanges);
            studentList.DisplayMember = "LastName";
        }

        private void studentList_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Get the selected student so we can use the
            // PersonID in the function import call.
            Person currentStudent = (Person)this.studentList
                .SelectedItem;

            // Set the data source for the gradeGridView
            // to the results returned by the GetStudentGrades
            // Function Import.
            gradeGridView.DataSource = schoolContext
                .GetStudentGrades(currentStudent.PersonID);
            gradeGridView.Columns["Course"].Visible = false;
            gradeGridView.Columns["StudentID"].Visible = false;
            gradeGridView.Columns["Person"].Visible = false;
            gradeGridView.Columns["EnrollmentID"].Visible = false;
            gradeGridView.AllowUserToAddRows = false;
            gradeGridView.AllowUserToDeleteRows = false;
        }
    }
}

Pasos siguientes

Ha creado correctamente una importación de función que recupera una colección de tipos de entidad. Para obtener más información sobre cómo compilar aplicaciones que usan 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