Procédure pas à pas : personnalisation du comportement d’insertion, de mise à jour et de suppression des classes d’entité

Remarque

Les jeux de données et les classes associées sont des technologies .NET Framework héritées qui datent du début des années 2000. Elles permettent aux applications d’utiliser des données en mémoire pendant que les applications sont déconnectées de la base de données. Elles sont particulièrement utiles aux applications qui permettent aux utilisateurs de modifier des données, et de rendre ces changements persistants dans la base de données. Même si les jeux de données sont une technologie très efficace, nous vous recommandons d’utiliser Entity Framework Core pour les nouvelles applications .NET. Entity Framework offre un moyen plus naturel d’utiliser des données tabulaires en tant que modèles objet. De plus, il présente une interface de programmation plus simple.

Les outils LINQ to SQL dans Visual Studio fournissent une surface de conception visuelle pour la création et la modification de classes LINQ to SQL (classes d’entités) basées sur des objets dans une base de données. En utilisant LINQ to SQL, vous permet d’utiliser la technologie LINQ pour accéder aux bases de données SQL. Pour plus d’informations, consultez LINQ (Language-Integrated Query).

Par défaut, la logique d’exécution des mises à jour est fournie par le runtime de LINQ to SQL. Le runtime crée les instructions Insert, Update et Delete par défaut en fonction du schéma de la table (définitions de colonne et informations de clé primaire). Si vous ne souhaitez pas utiliser le comportement par défaut, vous pouvez configurer le comportement de mise à jour et désigner des procédures stockées spécifiques pour exécuter les insertions, mises à jour et suppressions nécessaires à la manipulation des données dans la base de données. Vous pouvez également le faire lorsque le comportement par défaut n'est pas généré, par exemple lorsque vos classes d'entité mappent aux vues. En outre, vous pouvez substituer le comportement de mise à jour par défaut lorsque la base de données nécessite un accès aux tables via des procédures stockées. Pour plus d’informations, consultez Personnalisation d’opérations à l’aide de procédures stockées.

Notes

Cette procédure pas à pas nécessite les procédures stockées InsertCustomer, UpdateCustomer et DeleteCustomer pour la base de données Northwind.

Cette procédure pas à pas décrit les étapes à suivre pour substituer le comportement au moment de l’exécution par défaut de LINQ to SQL et enregistrer les données dans une base de données à l’aide de procédures stockées.

Pendant cette procédure pas à pas, vous allez apprendre à effectuer les tâches suivantes :

  • Créer une application Windows Forms et lui ajouter un fichier LINQ to SQL.

  • Créer une classe d’entité mappée à la table Customers Northwind.

  • Créer un objet source de données qui référence la classe Customer de LINQ to SQL.

  • Créer un Windows Form qui contient un DataGridView lié à la classe Customer.

  • Implémenter une fonctionnalité d'enregistrement pour le formulaire.

  • Créer des méthodes DataContext en ajoutant des procédures stockées au Concepteur Objet Relationnel.

  • Configurer la classe Customer pour utiliser des procédures stockées pour effectuer des insertions, des mises à jour et des suppressions.

Prérequis

Ce guide pas à pas utilise SQL Server Express LocalDB et l’échantillon de base de données Northwind.

  1. Si SQL Server Express LocalDB n’est pas installé, installez-le à partir de la page de téléchargement SQL Server Express, ou via le programme d’installation Visual Studio Installer. Dans Visual Studio Installer, vous pouvez installer la base de données locale SQL Server Express dans le cadre de la charge de travail Traitement et stockage de données, ou l’installer comme un composant seul.

  2. Installez l’exemple de base de données Northwind en procédant comme suit :

    1. Dans Visual Studio, ouvrez la fenêtre de l’Explorateur d’objets SQL Server. (L’Explorateur d’objets SQL Server est installé dans le cadre de la charge de travail Traitement et stockage de données dans Visual Studio Installer.) Développez le nœud SQL Server. Cliquez avec le bouton droit sur votre instance de base de données locale et sélectionnez Nouvelle requête.

      Une fenêtre d’éditeur de requête s’ouvre.

    2. Copiez le script Northwind Transact-SQL dans votre Presse-papiers. Ce script T-SQL crée la base de données Northwind à partir de zéro et la remplit avec des données.

    3. Collez le script T-SQL dans l’éditeur de requête, puis cliquez sur le bouton Exécuter.

      Après un court laps de temps, la requête se termine et la base de données Northwind est créée.

Création d’une application et ajout de classes LINQ to SQL

Comme vous travaillez avec les classes LINQ to SQL et affichez les données sur un Windows Form, vous devez créer une application Windows Forms et ajouter un fichier de classes LINQ to SQL.

Notes

Dans cet article, il est possible que votre ordinateur affiche des noms ou des emplacements différents pour certains éléments de l’interface utilisateur Visual Studio. Vous utilisez peut-être une autre édition de Visual Studio ou d'autres paramètres d'environnement. Pour plus d’informations, consultez Personnaliser l’IDE.

Pour créer un nouveau projet d’application Windows Forms qui contient des classes LINQ to SQL

  1. Dans Visual Studio, dans le menu Fichier, sélectionnez Nouveau>Projet.

  2. Développez Visual C# ou Visual Basic dans le volet gauche, puis sélectionnez Windows Desktop.

  3. Dans le volet central, sélectionnez le type de projet d’application Windows Forms.

  4. Nommez le projet UpdatingWithSProcsWalkthrough, puis cliquez sur OK.

    Le projet UpdatingWithSProcsWalkthrough est créé et ajouté à l’Explorateur de solutions.

  5. Dans le menu Projet , cliquez sur Ajouter un nouvel élément.

  6. Cliquez sur le modèle Classes LINQ to SQL et tapez Northwind.dbml dans la zone Nom.

  7. Cliquez sur Add.

    Un fichier de classes LINQ to SQL vide (Northwind.dbml) est ajouté au projet et le Concepteur Objet Relationnel s’ouvre.

Créer une classe d’entité du client et de l’objet source de données

Créez des classes LINQ to SQL mappées aux tables de base de données en faisant glisser des tables de l’Explorateur de serveurs ou de l’Explorateur de base de données vers le Concepteur Objet Relationnel. Les classes d'entité LINQ to SQL qui en résultent mappent aux tables de la base de données. Après avoir créé des classes d'entité, vous pouvez les utiliser en tant qu'objets sources de données comme toute autre classe ayant des propriétés publiques.

Pour créer une classe d'entité client et configurer une source de données correspondante

  1. Dans l’Explorateur de serveurs ou l’Explorateur de base de données, localisez la table Client dans la version SQL Server de l’exemple de base de données Northwind.

  2. Faites glisser le nœud Clients de l’Explorateur de serveurs ou de l’Explorateur de base de données vers l’aire du *Concepteur Objet Relationnel.

    Une classe d’entité nommée Customer est créée. Elle comporte des propriétés qui correspondent aux colonnes de la table Customers. La classe d’entité est nommée Customer (et non Customers) parce qu’elle représente un seul client de la table Customers.

    Notes

    Ce comportement de renommage est appelé pluralisation. Il peut être activé ou désactivé dans la boîte de dialogue Options. Pour plus d’informations, consultez Guide pratique pour activer et désactiver la pluralisation (Concepteur O/R).

  3. Dans le menu Générer, cliquez sur Générer UpdatingwithSProcsWalkthrough pour générer le projet.

  4. Pour ouvrir la fenêtre Sources de données, dans le menu Données, cliquez sur Afficher les sources de données.

  5. Dans la fenêtre Sources de données , cliquez sur Ajouter une nouvelle source de données.

  6. Dans la page Choisir un type de source de données, cliquez sur Objet, puis sur Suivant.

  7. Développez le nœud UpdatingwithSProcsWalkthrough, puis localisez et sélectionnez la classe Customer.

    Notes

    Si la classe Customer n’est pas disponible, quittez l’Assistant, générez le projet et réexécutez l’Assistant.

  8. Cliquez sur Terminer pour créer la source de données et ajouter la classe d’entité Customer à la fenêtre Sources de données.

Créer un DataGridView pour afficher les données de client sur un Windows Form

Créez des contrôles liés aux classes d'entité en faisant glisser des éléments de la source de données LINQ to SQL de la fenêtre Sources de données vers un Windows Form.

Pour ajouter des contrôles liés aux classes d'entité

  1. Ouvrez Form1 en mode Création.

  2. Depuis la fenêtre Sources de données, faites glisser le nœud Customer vers Form1.

    Notes

    Pour ouvrir la fenêtre Sources de données, cliquez sur Afficher les sources de données dans le menu Données.

  3. Ouvrez Form1 dans l’éditeur de code.

  4. Ajoutez le code suivant au formulaire, global au formulaire, en dehors de toute méthode spécifique mais à l’intérieur de la classe Form1 :

    private NorthwindDataContext northwindDataContext1
        = new NorthwindDataContext();
    
  5. Créez un gestionnaire d'événements pour l'événement Form_Load et ajoutez le code suivant au gestionnaire :

    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

Implémenter la fonctionnalité d’enregistrement

Par défaut, le bouton d'enregistrement n'est pas activé et la fonctionnalité d'enregistrement n'est pas implémentée. En outre, le code n'est pas automatiquement ajouté pour enregistrer dans les bases de données des données modifiées lorsque les contrôles liés aux données sont créés pour les objets source de données. Cette section explique comment activer le bouton d’enregistrement et implémenter la fonctionnalité d’enregistrement pour les objets LINQ to SQL.

Pour implémenter la fonctionnalité d'enregistrement

  1. Ouvrez Form1 en mode Création.

  2. Sélectionnez le bouton d’enregistrement sur CustomerBindingNavigator (le bouton avec l’icône représentant une disquette).

  3. Dans la fenêtre Propriétés, attribuez à la propriété Enabled la valeur True.

  4. Double-cliquez sur le bouton d'enregistrement pour créer un gestionnaire d'événements et basculer vers l'éditeur de code.

  5. Ajoutez le code suivant dans le gestionnaire d'événements du bouton d'enregistrement :

    northwindDataContext1.SubmitChanges();
    

Substituer le comportement par défaut pour effectuer des mises à jour (insertions, mises à jour et suppressions)

Pour substituer le comportement de mise à jour par défaut

  1. Ouvrez le fichier LINQ to SQL dans le Concepteur Objet Relationnel. (Double-cliquez sur le fichier Northwind.dbml dans l’Explorateur de solutions.)

  2. Dans l’Explorateur de serveurs ou l’Explorateur de bases de données, développez le nœud Procédures stockées de la base de données Northwind et localisez les procédures stockées InsertCustomers, UpdateCustomers et DeleteCustomers.

  3. Faites glisser les trois procédures stockées vers le Concepteur Objet Relationnel.

    Les procédures stockées sont ajoutées au volet de méthodes comme méthodes DataContext. Pour plus d’informations, consultez Méthodes DataContext (Concepteur O/R).

  4. Sélectionnez la classe d’entité Client dans le Concepteur Objet Relationnel.

  5. Dans la fenêtre Propriétés, sélectionnez la propriété Insert.

  6. Cliquez sur les points de suspension (...) en regard de l’option Utiliser le runtime pour ouvrir la boîte de dialogue Configurer le comportement.

  7. Sélectionnez Personnaliser.

  8. Sélectionnez la méthode InsertCustomers dans la liste Personnaliser.

  9. Cliquez sur Appliquer pour enregistrer la configuration de la classe et du comportement sélectionnés.

    Notes

    Vous pouvez continuer à configurer le comportement de chaque combinaison classe/comportement tant que vous cliquez sur Appliquer après chaque modification. Si vous modifiez la classe ou le comportement avant de cliquer sur Appliquer, une boîte de dialogue d’avertissement s’affiche pour vous donner la possibilité d’appliquer toutes les modifications.

  10. Sélectionnez Mettre à jour dans la liste Comportement.

  11. Sélectionnez Personnaliser.

  12. Sélectionnez la méthode UpdateCustomers dans la liste Personnaliser.

    Inspectez la liste des Arguments de méthode et des Propriétés de classe ; remarquez qu’il y a deux Arguments de méthode et deux Propriétés de classe pour certaines colonnes de la table. Cela simplifie le suivi des modifications et la création des instructions qui vérifient les violations d'accès concurrentiel.

  13. Mappez l’argument de méthode Original_CustomerID à la propriété de classe CustomerID (Original).

    Notes

    Par défaut, les arguments de méthode sont mappés à des propriétés de classe lorsque les noms correspondent. Si les noms de propriété sont modifiés et ne correspondent plus entre la table et la classe d’entité, vous devrez peut-être sélectionner la propriété de classe équivalente à mapper si le Concepteur O/R ne peut pas déterminer le mappage correct. En outre, si les arguments de méthode n’ont pas de propriétés de classe valides à mapper, vous pouvez donner à Propriétés de classe la valeur (Aucune).

  14. Cliquez sur Appliquer pour enregistrer la configuration de la classe et du comportement sélectionnés.

  15. Sélectionnez Supprimer dans la liste Comportement.

  16. Sélectionnez Personnaliser.

  17. Sélectionnez la méthode DeleteCustomers dans la liste Personnaliser.

  18. Mappez l’argument de méthode Original_CustomerID à la propriété de classe CustomerID (Original).

  19. Cliquez sur OK.

Remarque

Bien qu'il ne s'agisse pas d'un problème pour cette procédure pas à pas, notez que LINQ to SQL gère automatiquement les valeurs générées par une base de données pour les colonnes identity (incrémentation automatique), rowguidcol (identificateur global unique [GUID]) généré par la base de données) et timestamp lors des insertions et des mises à jour. Les valeurs générées par une base de données dans les autres types de colonne entraînent une valeur null de manière inopinée. Pour retourner les valeurs générées par la base de données, vous devez définir manuellement IsDbGenerated sur true et AutoSync sur l’une des valeurs suivantes : AutoSync.Always, AutoSync.OnInsert ou AutoSync.OnUpdate.

Test de l’application

Exécutez une nouvelle fois l’application pour vérifier que la procédure stockée UpdateCustomers met à jour correctement l’enregistrement Customer dans la base de données.

  1. Appuyez sur F5.

  2. Modifiez un enregistrement dans la grille pour tester le comportement de mise à jour.

  3. Ajoutez un nouvel enregistrement pour tester le comportement d’insertion.

  4. Cliquez sur le bouton d'enregistrement pour enregistrer les modifications dans la base de données.

  5. Fermez le formulaire.

  6. Appuyez sur F5 et vérifiez que l’enregistrement mis à jour et l’enregistrement inséré persistent.

  7. Supprimez le nouvel enregistrement que vous avez créé au cours de l’étape 3 pour tester le comportement de suppression.

  8. Cliquez sur le bouton d’enregistrement pour valider les modifications et supprimer l’enregistrement effacé de la base de données.

  9. Fermez le formulaire.

  10. Appuyez sur F5 et vérifiez que l’enregistrement effacé a bien été supprimé de la base de données.

    Remarque

    Si votre application utilise SQL Server Express Edition, selon la valeur de la propriété Copier dans le répertoire de sortie du fichier de base de données, les modifications peuvent ne pas paraître quand vous appuyez sur F5 à l'étape 10.

Étapes suivantes

Selon les exigences de votre application, vous pouvez effectuer différentes étapes après avoir créé des classes d'entité LINQ to SQL. Vous pouvez apporter à cette procédure pas à pas les améliorations suivantes :