Procédure pas à pas : récupération de types d'entités avec une procédure stockée

Cette rubrique montre comment utiliser une procédure stockée pour récupérer une collection de types d'entités. Dans cette procédure, vous allez utiliser ADO.NET Entity Data Model Designer (Concepteur d'entités) pour importer une procédure stockée et créer un Function Import qui retourne une collection de types d'entités.

Le fait d'inclure une procédure stockée dans le modèle EDM (Entity Data Model) vous permet d'appeler la procédure stockée à partir du code de votre application. Lorsqu'une procédure stockée est ajoutée au modèle conceptuel, elle est appelée Function Import. Un Function Import peut retourner des collections de types simples ou de types d'entités, ou aucune valeur.

NoteRemarque

Pour qu'un Function Import retourne un EntityType, les colonnes retournées par les procédures stockées correspondantes doivent correspondre exactement aux propriétés du EntityType retourné.

Lorsque l'Assistant EDM génère un modèle EDM à partir d'une base de données, il crée des entrées dans le modèle de stockage pour chaque procédure stockée de la base de données. Les entrées correspondantes sont ajoutées au modèle conceptuel lorsqu'un Function Import est créé. Pour plus d'informations sur la création d'un Function Import, voir Procédure : importer une procédure stockée.

Configuration requise

Pour effectuer cette procédure pas à pas, vous devez créer l'application CourseManager. Pour plus d'informations et d'instructions, voir le Démarrage rapide d'Entity Framework. Après avoir créé cette application, vous modifierez son modèle EDM en créant un Function Import basé sur la procédure stockée GetStudentGrades.

NoteRemarque

Étant donné qu'un grand nombre des rubriques de procédure pas à pas de cette documentation utilisent l'application CourseManager comme point de départ, nous vous recommandons d'utiliser une copie de l'application CourseManager pour cette procédure pas à pas, plutôt que de modifier le code CourseManager d'origine.

Cette procédure pas à pas suppose que le lecteur a des compétences de base avec Visual Studio, le .NET Framework et la programmation en Visual C# ou en Visual Basic.

Création d'un Function Import

Dans cette procédure, vous allez créer un Function Import basé sur la procédure stockée GetStudentGrades qui est incluse dans le modèle de stockage du modèle EDM CourseManager.

Pour créer un Function Import

  1. Ouvrez la solution CourseManager dans Visual Studio.

  2. Dans l'Explorateur de solutions, double-cliquez sur le fichier School.edmx.

    Le fichier School.edmx s'ouvre dans ADO.NET Entity Data Model Designer (Concepteur d'entités) et la fenêtre Explorateur de modèles s'affiche.

  3. Développez le nœud EntityContainer : SchoolEntities dans la fenêtre Explorateur de modèles.

    Les dossiers Jeux d'entités, Ensembles d'associations et Function Imports sont visibles dans l'arborescence.

  4. Cliquez avec le bouton droit sur Function Imports, puis sélectionnez Créer un Function Import.

    La boîte de dialogue New Function Import s'affiche.

  5. Sélectionnez GetStudentGrades dans la liste déroulante Nom de la procédure stockée.

  6. Tapez GetStudentGrades dans la zone de texte Nom du Function Import.

  7. Sélectionnez CourseGrade dans la liste déroulante Type de retour.

    NoteRemarque

    Il est possible de définir le type de retour sur CourseGrade car les colonnes qui sont retournées par la procédure stockée GetStudentGrades (EnrollementID et Grade) correspondent exactement aux propriétés scalaires du type d'entité CourseGrade.

  8. Cliquez sur OK.

    Le Function ImportGetStudentGrades est ajouté au modèle EDM.

Création de l'interface utilisateur

Dans cette procédure, vous allez ajouter des éléments à l'interface utilisateur de l'application CourseManager afin que les notes d'un étudiant sélectionné puissent être affichées.

Pour créer l'interface utilisateur

  1. Cliquez avec le bouton droit sur le projet CourseManager dans l'Explorateur de solutions, pointez sur Ajouter, puis sélectionnez Nouvel élément.

    La boîte de dialogue Ajouter un nouvel élément s'affiche.

  2. Sélectionnez Windows Form, définissez GradeViewer.vb ou GradeViewer.cs comme nom du formulaire, puis cliquez sur Ajoutez.

    Un nouveau formulaire est ajouté au projet et s'ouvre dans le concepteur de formulaires. Le nom du formulaire a la valeur GradeViewer et le texte a la valeur GradeViewer.

  3. Faites glisser un contrôle ComboBox de la boîte à outils vers le formulaire et affectez à son champ Nom la valeur studentList dans la fenêtre Propriétés.

  4. Faites glisser un contrôle DataGridView de la boîte à outils vers le formulaire et affectez à son champ Nom la valeur gradeGridView dans la fenêtre Propriétés.

  5. Double-cliquez sur le fichier CourseViewer.vb ou CourseViewer.cs dans l'Explorateur de solutions.

    Le fichier s'ouvre dans le concepteur de formulaires.

  6. Faites glisser un contrôle Button vers le formulaire. Affectez à son champ Name la valeur viewGrades et à son champ Text la valeur ViewGrades.

  7. Double-cliquez sur le contrôle ButtonviewGrades.

    Le gestionnaire d'événements viewGrades_Click est ajouté au fichier code-behind.

  8. Ajoutez le code suivant au gestionnaire d'événements viewGrades_Click :

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

L'interface utilisateur est maintenant terminée.

Récupération de types d'entités avec une procédure stockée

Dans cette procédure, vous allez ajouter du code qui exécute le Function Import que vous avez précédemment créé à partir de la procédure stockée GetStudentGrades. Le code lie ensuite la collection EntityType retournée à un contrôle DataGridView. Pour plus d'informations sur la liaison d'objets à des contrôles, voir Liaison d'objets à des contrôles (Entity Framework).

Pour récupérer des types d'entités avec une procédure stockée

  1. Le formulaire GradeViewer étant ouvert dans le concepteur de formulaires, double-cliquez sur le corps du rapport.

    Le fichier code-behind du formulaire GradeViewer s'ouvre.

  2. Ajoutez les instructions using (C#) ou Imports (Visual Basic) suivantes :

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. Ajoutez une propriété à la classe GradeViewer qui représente le contexte de l'objet :

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. Dans le gestionnaire d'événements GradeViewer_Load, ajoutez le code suivant. Ce code initialise le contexte de l'objet et affecte à la source de données du contrôle ComboBox une requête qui retourne tous les types Person qui n'ont pas un EnrollmentDatenull.

    ' 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. Repassez en mode création du formulaire GradeViewer, puis double-cliquez sur le contrôle ComboBoxstudentList.

    Le gestionnaire d'événements studentList_SelectedIndexChanged est ajouté au fichier code-behind.

  6. Ajoutez le code suivant au gestionnaire d'événements studentList_SelectedIndexChanged. Ce code exécute le FunctionImportGetStudentGrades et lie les résultats au contrôle DataGridView quand un nouvel étudiant est sélectionné dans la liste déroulante.

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

Appuyez sur Ctrl+F5 pour exécuter l'application. Vous pouvez maintenant voir les informations relatives aux notes des étudiants en cliquant sur View Grades et en sélectionnant un étudiant dans la liste déroulante dans le formulaire Grade Viewer.

Liste de codes

Cette section contient la version finale du fichier code-behind pour le formulaire 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);
        }
    }
}

Étapes suivantes

Vous avez créé avec succès un Function Import qui récupère une collection de types d'entités. Pour plus d'informations sur la prise en charge des procédures stockées dans Entity Framework, voir Prise en charge des procédures stockées (Entity Framework). Pour plus d'informations sur la création d'applications qui utilisent Entity Framework, voir Guide de programmation (Entity Framework).

Voir aussi

Autres ressources

Scénarios ADO.NET Entity Data Model Designer
Tâches des outils Entity Data Model