Procédures designer CUD stockées

Cette procédure pas à pas montre comment mapper les opérations create\insert, update et delete (CUD) d’un type d’entité aux procédures stockées à l’aide du Concepteur Entity Framework (EF Designer).  Par défaut, Entity Framework génère automatiquement les instructions SQL pour les opérations CUD, mais vous pouvez également mapper des procédures stockées à ces opérations.  

Notez que Code First ne prend pas en charge le mappage aux procédures stockées ou aux fonctions. Toutefois, vous pouvez appeler des procédures stockées ou des fonctions à l’aide de la méthode System.Data.Entity.DbSet.SqlQuery. Par exemple :

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]");

Considérations relatives au mappage des opérations CUD aux procédures stockées

Lors du mappage des opérations CUD aux procédures stockées, les considérations suivantes s’appliquent :

  • Si vous mappez l’une des opérations CUD à une procédure stockée, mappez-les toutes. Si vous ne mappez pas les trois, les opérations non mappées échouent si elles sont exécutées et une UpdateException sera levée.
  • Vous devez mapper chaque paramètre de la procédure stockée aux propriétés d’entité.
  • Si le serveur génère la valeur de clé primaire de la ligne insérée, vous devez mapper cette valeur à la propriété de clé de l’entité. Dans l’exemple suivant, la procédure stockée InsertPerson retourne la clé primaire nouvellement créée en tant que partie intégrante du jeu de résultats de la procédure stockée. La clé primaire est mappée à la clé d'entité (PersonID) à l'aide de la fonctionnalité <Ajouter un Result Binding> de EF Designer.
  • La procédure stockée des d’appels sont mappées à l’identique avec les entités du modèle conceptuel. Par exemple, si vous implémentez une hiérarchie d’héritage dans votre modèle conceptuel, puis mappez les procédures stockées CUD pour les parent (base) et les entités enfant (dérivées), l’enregistrement des modifications enfant appelle uniquement les procédures stockées de enfant, elle ne déclenche pas les appels de procédures stockées Parent.

Prérequis

Pour exécuter ce processus pas à pas, vous devez :

Configurer le projet

  • Ouvrez Visual Studio 2012.
  • Sélectionnez Fichier>, Nouveau, puis >Projet
  • Dans le volet gauche, cliquez sur Visual C#, puis sélectionnez le modèle Console.
  • Entrez CUDSProcsSample comme nom.
  • Sélectionnez OK.

Créer un modèle

  • Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, puis sélectionnez Ajouter >> Nouvel élément.

  • Sélectionnez Données dans le menu de gauche, puis sélectionnez ADO.NET Entity Data Model dans le menu des Modèles.

  • Entrez CUDSProcs.edmx comme nom de fichier, puis cliquez sur Ajouter.

  • Dans la boîte de dialogue Choisir le contenu du Model, sélectionnez Générer à partir de la base de données, puis cliquez sur Suivant.

  • Cliquer sur Nouvelle connexion. Dans la boîte de dialogue Propriétés de connexion, entrez le nom du serveur (par exemple, (localdb)\mssqllocaldb), sélectionnez la méthode d'authentification, tapez School comme nom de base de données, puis cliquez sur OK. La boîte de dialogue Choisir votre connexion de données est mise à jour avec vos paramètres de connexion de base de données.

  • Dans la boîte de dialogue Choisir vos objets de base de donnée, sous le nœud Tables et sélectionnez la table Personne.

  • Sélectionnez également les procédures stockées suivantes sous le nœud Procédures stockées et Fonctions : DeletePerson, InsertPersonet UpdatePerson.

  • À compter de Visual Studio 2012, EF Designer prend en charge l’importation en bloc de procédures stockées. L’option Importer des procédures et fonctions stockées sélectionnées dans le modèle de l’entité est activé par défaut. Dans cet exemple, nous avons des procédures stockées qui insèrent, mettent à jour et suppriment des types d’entités, nous ne voulons pas les importer et décochons cette case.

    Import S Procs

  • Cliquez sur Terminer. Le EF Designer, qui fournit une aire de conception permettant de modifier votre modèle, est affiché.

Mapper l'entité Person à des procédures stockées

  • Cliquez avec le bouton droit sur le type d'entité Personne, puis sélectionnez Mappage de procédure stockée.

  • Les mappages de procédures stockées apparaissent dans la fenêtre Détails de mappage.

  • Cliquez sur <Sélectionner un Insert Function>. Le champ devient une liste déroulante des procédures stockées dans le modèle de stockage qui peut être mappé aux types d'entité dans le modèle conceptuel. Sélectionnez InsertPerson dans la liste déroulante.

  • Les mappages par défaut entre les paramètres des procédures stockées et les propriétés d'entité apparaissent. Notez que les flèches indiquent le sens du mappage : les valeurs des propriétés sont fournies aux paramètres des procédures stockées.

  • Cliquez sur <Ajouter un Result Binding>.

  • Tapez NewPersonID, le nom du paramètre retourné par la procédure stockée InsertPerson. Veillez à ne pas taper d’espaces de début ou de fin.

  • Appuyez sur Entrée.

  • Par défaut, NewPersonID est mappé à la clé d’entité PersonID. Notez qu'une flèche indique le sens du mappage : la valeur de la colonne de résultats est fournie à la propriété.

    Mapping Details

  • Cliquez sur <Sélectionner une fonction de mise à jour>, puis sélectionnez UpdatePerson dans la liste déroulante résultante.

  • Les mappages par défaut entre les paramètres des procédures stockées et les propriétés d'entité apparaissent.

  • Cliquez sur <Sélectionner un Delete Function>, puis sélectionnez DeletePerson dans la liste déroulante résultante.

  • Les mappages par défaut entre les paramètres des procédures stockées et les propriétés d'entité apparaissent.

Les opérations d'insertion, de mise à jour et de suppression du type d'entité Personne sont maintenant mappées à des procédures stockées.

Si vous souhaitez activer la vérification de la concurrence lors de la mise à jour ou de la suppression d’une entité avec des procédures stockées, utilisez l’une des options suivantes :

  • Utilisez un paramètre OUTPUT pour retourner le nombre de lignes affectées à partir de la procédure stockée et cochez la case Paramètre affecté en regard du nom du paramètre. Si la valeur retournée est égale à zéro lorsque l’opération est appelée, une OptimisticConcurrencyException sera levée.
  • Cochez la case Utiliser la valeur d’origine en regard d’une propriété que vous souhaitez utiliser pour la vérification de la concurrence. En cas de tentative de mise à jour, la valeur de la propriété , qui a été initialement lue dans la base de données, sera utilisée lors de la réécriture de données à la base de données. Si la valeur ne correspond pas à la valeur de la base de données, une exception OptimisticConcurrencyException sera levée.

Utiliser le Modèle

Ouvrez le fichier Program.cs où la méthode Main est définie. Collez le code suivant dans la fonction Main.

Le code crée un objet Person , puis met à jour l’objet, puis supprime l’objet.

    using (var context = new SchoolEntities())
    {
        var newInstructor = new Person
        {
            FirstName = "Robyn",
            LastName = "Martin",
            HireDate = DateTime.Now,
            Discriminator = "Instructor"
        }

        // Add the new object to the context.
        context.People.Add(newInstructor);

        Console.WriteLine("Added {0} {1} to the context.",
            newInstructor.FirstName, newInstructor.LastName);

        Console.WriteLine("Before SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // SaveChanges will call the InsertPerson sproc.  
        // The PersonID property will be assigned the value
        // returned by the sproc.
        context.SaveChanges();

        Console.WriteLine("After SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // Modify the object and call SaveChanges.
        // This time, the UpdatePerson will be called.
        newInstructor.FirstName = "Rachel";
        context.SaveChanges();

        // Remove the object from the context and call SaveChanges.
        // The DeletePerson sproc will be called.
        context.People.Remove(newInstructor);
        context.SaveChanges();

        Person deletedInstructor = context.People.
            Where(p => p.PersonID == newInstructor.PersonID).
            FirstOrDefault();

        if (deletedInstructor == null)
            Console.WriteLine("A person with PersonID {0} was deleted.",
                newInstructor.PersonID);
    }
  • Compilez et exécutez l'application. Le programme génère la sortie suivante *

Remarque

PersonID est généré automatiquement par le serveur. Vous verrez donc probablement un nombre différent*

Added Robyn Martin to the context.
Before SaveChanges, the PersonID is: 0
After SaveChanges, the PersonID is: 51
A person with PersonID 51 was deleted.

Si vous utilisez la version Ultime de Visual Studio, vous pouvez utiliser Intellitrace avec le débogueur pour afficher les instructions SQL qui sont exécutées.

Debug With Intellitrace