Compartir a través de


Tutorial: recuperar tipos de entidad con un procedimiento almacenado

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

La inclusión de un procedimiento almacenado en un Entity Data Model (EDM) permite llamar al procedimiento almacenado desde el código de la aplicación. Cuando se agrega un procedimiento almacenado al modelo conceptual, se llama a una Function Import. Una Function Import puede devolver colecciones de tipos simples o tipos de entidad, o ningún valor.

Nota

Para que una Function Import devuelva un EntityType, las columnas que devuelve el procedimiento almacenado correspondiente deben coincidir exactamente con las propiedades del EntityType devuelto.

Cuando el Asistente para Entity Data Model genera un EDM 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 Function Import. Para obtener más información sobre cómo crear una Function Import, vea Cómo importar un procedimiento almacenado.

Requisitos previos

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

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.

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 funciones

En este procedimiento creará una Function Import basada en el procedimiento almacenado GetStudentGrades que está incluido en el modelo de almacenamiento del EDM de CourseManager.

Para crear una importación de funciones

  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 Crear importación de funciones.

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

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

  6. Escriba GetStudentGrades en el cuadro de texto Nombre de FunctionImport.

  7. Seleccione CourseGrade en la lista desplegable Tipo devuelto.

    Nota

    Podemos establecer el tipo de valor devuelto en CourseGrade porque las columnas que son devueltas por el procedimiento almacenado GetStudentGrades (EnrollementID y Grade) coinciden exactamente con las propiedades escalares del tipo de entidad CourseGrade.

  8. Haga clic en Aceptar.

    GetStudentGradesFunction Import se agrega al EDM.

Construir la interfaz de usuario

En este procedimiento agregará elementos 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 ViewGrades.

  7. Haga doble clic en el control viewGradesButton.

    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 Function Import 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 Enlazar objetos a controles (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 _
        .Person.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.Person
        .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 studentListComboBox.

    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)
    
    // 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);
    

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 _
            .Person.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)
    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.Person
                .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);
        }
    }
}

Pasos siguientes

Ha creado correctamente un Function Import que recupera una recopilación de tipos de entidad. Para obtener más información sobre la compatibilidad con los procedimientos almacenados en Entity Framework, vea Compatibilidad con los procedimientos almacenados (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