Partager via


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.

image15

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;

image14

Student les entités ont quatre propriétés : PersonID, LastName, FirstNameet 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.

image20

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.

image21

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.

image22

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.)

image23

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.

image01

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 .

image02

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.

image24

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 .

image25

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.

image03

Exécutez la page Students.aspx et le nouvel étudiant apparaît dans la liste.

image04

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.

image05

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.