Prise en main avec Entity Framework 4.0 Database First et ASP.NET 4 Web Forms - Partie 7
par Tom Dykstra
L’exemple d’application web Contoso University montre comment créer des applications ASP.NET Web Forms à l’aide d’Entity Framework 4.0 et de Visual Studio 2010. Pour plus d’informations sur la série de tutoriels, consultez le premier tutoriel de la série
Utilisation des procédures stockées
Dans le tutoriel précédent, vous avez implémenté un modèle d’héritage table par hiérarchie. Ce tutoriel vous montre comment utiliser des procédures stockées pour mieux contrôler l’accès à la base de données.
Entity Framework vous permet de spécifier qu’il doit utiliser des procédures stockées pour l’accès à la base de données. Pour n’importe quel type d’entité, vous pouvez spécifier une procédure stockée à utiliser pour créer, mettre à jour ou supprimer des entités de ce type. Ensuite, dans le modèle de données, vous pouvez ajouter des références à des procédures stockées que vous pouvez utiliser pour effectuer des tâches telles que la récupération d’ensembles d’entités.
L’utilisation de procédures stockées est une exigence courante pour l’accès à la base de données. Dans certains cas, un administrateur de base de données peut exiger que tous les accès à la base de données passent par des procédures stockées pour des raisons de sécurité. Dans d’autres cas, vous pouvez créer une logique métier dans certains des processus qu’Entity Framework utilise lorsqu’il met à jour la base de données. Par exemple, chaque fois qu’une entité est supprimée, vous pouvez la copier dans une base de données archive. Ou chaque fois qu’une ligne est mise à jour, vous pouvez écrire une ligne dans une table de journalisation qui enregistre qui a effectué la modification. Vous pouvez effectuer ces types de tâches dans une procédure stockée appelée chaque fois qu’Entity Framework supprime une entité ou met à jour une entité.
Comme dans le tutoriel précédent, vous ne créerez aucune nouvelle page. Au lieu de cela, vous allez modifier la façon dont Entity Framework accède à la base de données pour certaines des pages que vous avez déjà créées.
Dans ce tutoriel, vous allez créer des procédures stockées dans la base de données pour l’insertion et Instructor
les Student
entités. Vous allez les ajouter au modèle de données et spécifier que Entity Framework doit les utiliser pour ajouter Student
des entités et Instructor
à la base de données. Vous allez également créer une procédure stockée que vous pouvez utiliser pour récupérer des Course
entités.
Création de procédures stockées dans la base de données
(Si vous utilisez le fichier School.mdf du projet disponible en téléchargement avec ce didacticiel, vous pouvez ignorer cette section, car les procédures stockées existent déjà.)
Dans Server Explorer, développez School.mdf, cliquez avec le bouton droit sur Procédures stockées, puis sélectionnez Ajouter une nouvelle procédure stockée.
Copiez les instructions SQL suivantes et collez-les dans la fenêtre de procédure stockée, en remplaçant la procédure stockée squelette.
CREATE PROCEDURE [dbo].[InsertStudent]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
EnrollmentDate)
VALUES (@LastName,
@FirstName,
@EnrollmentDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
Student
les entités ont quatre propriétés : PersonID
, LastName
, FirstName
et EnrollmentDate
. La base de données génère automatiquement la valeur d’ID et la procédure stockée accepte les paramètres des trois autres. La procédure stockée retourne la valeur de la clé d’enregistrement de la nouvelle ligne afin que Entity Framework puisse effectuer le suivi de celle-ci dans la version de l’entité qu’il conserve en mémoire.
Enregistrez et fermez la fenêtre de procédure stockée.
Créez une InsertInstructor
procédure stockée de la même manière, à l’aide des instructions SQL suivantes :
CREATE PROCEDURE [dbo].[InsertInstructor]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
HireDate)
VALUES (@LastName,
@FirstName,
@HireDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
Créez également des Update
procédures stockées pour Student
les entités et Instructor
. (La base de données a déjà une DeletePerson
procédure stockée qui fonctionnera à la fois pour les Instructor
entités et Student
.)
CREATE PROCEDURE [dbo].[UpdateStudent]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
EnrollmentDate=@EnrollmentDate
WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
HireDate=@HireDate
WHERE PersonID=@PersonID;
Dans ce tutoriel, vous allez mapper les trois fonctions (insérer, mettre à jour et supprimer) pour chaque type d’entité. La version 4 d’Entity Framework vous permet de mapper une ou deux de ces fonctions à des procédures stockées sans mapper les autres, à une exception près : si vous mappez la fonction de mise à jour, mais pas la fonction de suppression, Entity Framework lève une exception lorsque vous tentez de supprimer une entité. Dans Entity Framework version 3.5, vous n’aviez pas cette grande flexibilité dans le mappage des procédures stockées : si vous mappiez une fonction, vous deviez mapper les trois.
Pour créer une procédure stockée qui lit plutôt que met à jour des données, créez-en une qui sélectionne toutes les Course
entités à l’aide des instructions SQL suivantes :
CREATE PROCEDURE [dbo].[GetCourses]
AS
SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course
Ajout des procédures stockées au modèle de données
Les procédures stockées sont désormais définies dans la base de données, mais elles doivent être ajoutées au modèle de données pour les rendre disponibles pour Entity Framework. Ouvrez SchoolModel.edmx, cliquez avec le bouton droit sur l’aire de conception, puis sélectionnez Mettre à jour le modèle à partir de la base de données. Sous l’onglet Ajouter de la boîte de dialogue Choisir vos objets de base de données , développez Procédures stockées, sélectionnez les procédures stockées et la DeletePerson
procédure stockée nouvellement créées, puis cliquez sur Terminer.
Mappage des procédures stockées
Dans le concepteur de modèle de données, cliquez avec le bouton droit sur l’entité Student
et sélectionnez Mappage de procédure stockée.
La fenêtre Détails du mappage s’affiche, dans laquelle vous pouvez spécifier des procédures stockées que Entity Framework doit utiliser pour l’insertion, la mise à jour et la suppression d’entités de ce type.
Définissez la fonction Insert sur InsertStudent. La fenêtre affiche une liste de paramètres de procédure stockée, chacun d’eux devant être mappé à une propriété d’entité. Deux d’entre elles sont mappées automatiquement, car les noms sont identiques. Aucune propriété d’entité n’est nommée FirstName
. Vous devez donc sélectionner FirstMidName
manuellement dans une liste déroulante qui affiche les propriétés d’entité disponibles. (C’est parce que vous avez modifié le nom de la FirstName
propriété par FirstMidName
dans le premier tutoriel.)
Dans la même fenêtre Détails du mappage , mappez la Update
fonction à la UpdateStudent
procédure stockée (veillez à spécifier FirstMidName
comme valeur de paramètre pour FirstName
, comme vous l’avez fait pour la Insert
procédure stockée) et la Delete
fonction à la DeletePerson
procédure stockée.
Suivez la même procédure pour mapper les procédures stockées d’insertion, de mise à jour et de suppression pour les instructeurs à l’entité Instructor
.
Pour les procédures stockées qui lisent plutôt que mettent à jour des données, vous utilisez la fenêtre Explorateur de modèles pour mapper la procédure stockée au type d’entité qu’elle retourne. Dans le concepteur de modèle de données, cliquez avec le bouton droit sur l’aire de conception et sélectionnez Explorateur de modèles. Ouvrez le nœud SchoolModel.Store , puis le nœud Procédures stockées . Cliquez ensuite avec le bouton droit sur la GetCourses
procédure stockée et sélectionnez Ajouter l’importation de fonction.
Dans la boîte de dialogue Ajouter une importation de fonction , sous Retourne une collection de entités, sélectionnez Entités, puis sélectionnez Course
comme type d’entité retourné. Quand vous avez terminé, cliquez sur OK. Enregistrez et fermez le fichier .edmx .
Utilisation de procédures stockées d’insertion, de mise à jour et de suppression
Les procédures stockées pour insérer, mettre à jour et supprimer des données sont automatiquement utilisées par Entity Framework une fois que vous les avez ajoutées au modèle de données et que vous les avez mappées aux entités appropriées. Vous pouvez maintenant exécuter la page StudentsAdd.aspx et chaque fois que vous créez un étudiant, Entity Framework utilise la InsertStudent
procédure stockée pour ajouter la nouvelle ligne à la Student
table.
Exécutez la page Students.aspx et le nouvel étudiant apparaît dans la liste.
Modifiez le nom pour vérifier que la fonction de mise à jour fonctionne, puis supprimez l’étudiant pour vérifier que la fonction de suppression fonctionne.
Utilisation de l’option Sélectionner des procédures stockées
Entity Framework n’exécute pas automatiquement les procédures stockées telles que GetCourses
, et vous ne pouvez pas les utiliser avec le EntityDataSource
contrôle. Pour les utiliser, vous les appelez à partir du code.
Ouvrez le fichier InstructorsCourses.aspx.cs . La PopulateDropDownLists
méthode utilise une requête LINQ-to-Entities pour récupérer toutes les entités de cours afin qu’elle puisse parcourir la liste et déterminer celles auxquelles un instructeur est affecté et celles qui ne sont pas attribuées :
var allCourses = (from c in context.Courses
select c).ToList();
Remplacez ceci par le code suivant :
var allCourses = context.GetCourses();
La page utilise désormais la GetCourses
procédure stockée pour récupérer la liste de tous les cours. Exécutez la page pour vérifier qu’elle fonctionne comme avant.
(Les propriétés de navigation des entités récupérées par une procédure stockée peuvent ne pas être remplies automatiquement avec les données associées à ces entités, en fonction ObjectContext
des paramètres par défaut. Pour plus d’informations, consultez Chargement d’objets connexes dans MSDN Library.)
Dans le tutoriel suivant, vous allez apprendre à utiliser la fonctionnalité Dynamic Data pour faciliter la programmation et le test des règles de mise en forme et de validation des données. Au lieu de spécifier sur chaque page web des règles telles que des chaînes de format de données et si un champ est requis ou non, vous pouvez spécifier ces règles dans les métadonnées du modèle de données et elles sont automatiquement appliquées à chaque page.