Procédure pas à pas : récupération de types d'entité avec une procédure stockée (Entity Data Model Tools)
Cette rubrique montre comment utiliser une procédure stockée pour récupérer une collection de types d'entité. Dans cette procédure pas à pas, vous allez utiliser ADO.NET Entity Data Model Designer (Entity Designer) pour importer une procédure stockée et créer une importation de fonction qui retourne une collection de types d'entité.
Le fait d'inclure une procédure stockée dans votre modèle conceptuel 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 « importation de fonction ». Une importation de fonction peut retourner des collections de types simples, de types complexes, de types d'entité, ou aucune valeur.
Remarque : |
---|
Pour qu'une importation de fonction retourne un EntityType, les colonnes retournées par la procédure stockée correspondante doivent correspondre exactement aux propriétés scalaires du EntityType retourné. |
Lorsque l'Assistant EDM génère un fichier .edmx à 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'une importation de fonction est créée. Pour plus d'informations sur la création d'une importation de fonction, consultez Procédure : importer une procédure stockée (Entity Data Model Tools).
Configuration requise
Pour effectuer cette procédure pas à pas, vous devez générer l'application CourseManager. Pour plus d'informations et d'instructions, consultez Démarrage rapide d'Entity Framework. Après avoir généré cette application, modifiez son modèle conceptuel en créant une importation de fonction selon la procédure stockée GetStudentGrades.
Remarque : |
---|
É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'une importation de fonction
Dans cette procédure, vous allez créer une importation de fonction selon la procédure stockée GetStudentGrades qui est incluse dans le modèle de stockage de l'application CourseManager.
Pour créer une importation de fonction
Ouvrez la solution CourseManager dans Visual Studio.
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.
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 Importations de fonction sont visibles dans l'arborescence.
Cliquez avec le bouton droit sur Importations de fonction, puis sélectionnez Ajouter une importation de fonction.
La boîte de dialogue Add Function Import s'affiche.
Sélectionnez GetStudentGrades dans la liste déroulante Nom de la procédure stockée.
Tapez GetStudentGrades dans la zone de texte Nom de l'importation de fonction.
Sélectionnez Entités comme valeur de retour, puis StudentGrade dans la liste déroulante correspondante.
Remarque : Il est possible d'attribuer au type de retour la valeur StudentGrade, car les colonnes qui sont retournées par la procédure stockée GetStudentGrades (EnrollementID, StudentID, CourseID et Grade) correspondent exactement aux propriétés scalaires du type d'entité StudentGrade. Cliquez sur OK.
L'Function Import GetStudentGrades est ajoutée au modèle conceptuel.
Création de l'interface utilisateur
Dans cette procédure, vous allez ajouter un nouveau formulaire à 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
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.
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.
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.
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.
Double-cliquez sur le fichier CourseViewer.vb ou CourseViewer.cs dans l'Explorateur de solutions.
Le fichier s'ouvre dans le concepteur de formulaires.
Faites glisser un contrôle Button vers le formulaire. Affectez à son champ Name la valeur viewGrades et à son champ Text la valeur ViewGrades.
Double-cliquez sur le contrôle Button viewGrades.
Le gestionnaire d'événements viewGrades_Click est ajouté au fichier code-behind.
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é avec une procédure stockée
Dans cette procédure, vous allez ajouter du code qui exécute l'importation de fonction que vous avez précédemment créée à 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, consultez Binding Objects to Controls (Entity Framework).
Pour récupérer des types d'entité avec une procédure stockée
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.
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;
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;
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 EnrollmentDate Null.
' 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";
Repassez en mode création du formulaire GradeViewer, puis double-cliquez sur le contrôle ComboBox studentList.
Le gestionnaire d'événements studentList_SelectedIndexChanged est ajouté au fichier code-behind.
Ajoutez le code suivant au gestionnaire d'événements studentList_SelectedIndexChanged. Ce code exécute le FunctionImport GetStudentGrades 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) 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;
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 _
.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;
}
}
}
Étapes suivantes
Vous venez de créer une importation de fonction qui récupère une collection de types d'entité. Pour plus d'informations sur la création d'applications qui utilisent Entity Framework, consultez ADO.NET Entity Framework.
Voir aussi
Autres ressources
Scénarios Entity Data Model Tools
Tâches Entity Data Model Tools