Créer des relations entre les jeux de données des applications .NET Framework

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 jeux de données qui contiennent des tables de données associées utilisent des objets DataRelation pour représenter une relation parent/enfant entre les tables et pour retourner les enregistrements parents et enfants associés. Quand vous ajoutez des tables associées à des jeux de données à l’aide de l’Assistant Configuration de source de données ou du Concepteur de DataSet, l’objet DataRelation est créé et configuré pour vous.

L’objet DataRelation assure deux fonctions :

  • Il peut rendre disponibles les enregistrements associés à un enregistrement avec lequel vous travaillez. Il fournit les enregistrements enfants si vous êtes dans un enregistrement parent (GetChildRows) et un enregistrement parent si vous travaillez avec un enregistrement enfant (GetParentRow).

  • Il peut appliquer des contraintes pour l’intégrité référentielle, par exemple la suppression des enregistrements enfants associés quand vous supprimez un enregistrement parent.

Il est important de comprendre la différence entre une jointure réelle et la fonction d’un objet DataRelation. Dans une jointure réelle, les enregistrements sont extraits des tables parente et enfants et placés dans un recordset plat unique. Quand vous utilisez un objet DataRelation, aucun recordset n’est créé. Au lieu de cela, l’objet DataRelation suit la relation entre les tables et synchronise les enregistrements parents et enfants.

Objets DataRelation et contraintes

Un objet DataRelation est également utilisé pour créer et appliquer les contraintes suivantes :

  • Une contrainte unique, qui garantit qu’une colonne de la table ne contient pas de doublons

  • Une contrainte de clé étrangère, qui peut être utilisée pour maintenir l’intégrité référentielle entre une table parente et une table enfant dans un jeu de données

Les contraintes que vous spécifiez dans un objet DataRelation sont implémentées en créant les objets appropriés ou en définissant des propriétés automatiquement. Si vous créez une contrainte de clé étrangère à l’aide de l’objet DataRelation, des instances de la classe ForeignKeyConstraint sont ajoutées à la propriété ChildKeyConstraint de l’objet DataRelation.

Une contrainte unique est implémentée en définissant simplement la propriété Unique d’une colonne de données sur true ou en ajoutant une instance de la classe UniqueConstraint à la propriété ParentKeyConstraint de l’objet DataRelation. Pour plus d’informations sur la suspension de contraintes dans un jeu de données, consultez Désactiver les contraintes pendant le remplissage d’un dataset.

Règles d’intégrité référentielle

Dans le cadre de la contrainte de clé étrangère, vous pouvez spécifier des règles d’intégrité référentielle, qui sont appliquées dans trois situations :

  • Quand un enregistrement parent est mis à jour

  • Quand un enregistrement parent est supprimé

  • Quand une modification est acceptée ou rejetée

Les règles que vous pouvez appliquer sont spécifiées dans l’énumération Rule et sont listées dans le tableau suivant.

Contrainte de contrainte de clé étrangère Action
Cascade La modification (mise à jour ou suppression) apportée à l’enregistrement parent est également effectuée sur les enregistrements associés de la table enfant.
SetNull Les enregistrements enfants ne sont pas supprimés, mais la clé étrangère dans les enregistrements enfants est définie sur DBNull. Avec ce paramètre, les enregistrements enfants peuvent être gardés « orphelins », c’est-à-dire qu’ils n’ont aucune relation avec des enregistrements parents. Remarque : L’utilisation de cette règle peut entraîner la présence de données non valides dans la table enfant.
SetDefault La clé étrangère dans les enregistrements enfants associés est définie sur sa valeur par défaut (telle qu’établie par la propriété DefaultValue de la colonne).
None Aucune modification n’est apportée aux enregistrements enfants associés. Avec ce paramètre, les enregistrements enfants peuvent contenir des références à des enregistrements parents non valides.

Pour plus d’informations sur les mises à jour dans les tables de jeux de données, consultez Enregistrer les données dans la base de données.

Relations de contrainte uniquement

Quand vous créez un objet DataRelation, vous pouvez spécifier que la relation doit être utilisée uniquement pour appliquer des contraintes, c’est-à-dire qu’elle ne sera pas utilisée également pour l’accès aux enregistrements associés. Vous pouvez utiliser cette option pour générer un jeu de données un peu plus efficace et contenant moins de méthodes qu’un jeu de données avec une relation permettant l’accès aux enregistrements associés. Toutefois, vous ne pourrez pas accéder aux enregistrements associés. Par exemple, une relation de contrainte uniquement vous empêche de supprimer un enregistrement parent qui a toujours des enregistrements enfants et vous d’accéder aux enregistrements enfants par le biais du parent.

Création manuelle d’une relation de données dans le Concepteur de DataSet

Quand vous créez des tables de données à l’aide des outils de conception de données dans Visual Studio, des relations sont créées automatiquement si les informations peuvent être collectées à partir de la source de vos données. Si vous ajoutez manuellement des tables de données à partir de l'onglet DataSet de la Boîte à outils, vous devrez peut-être créer la relation manuellement. Pour plus d’informations sur la création d’objets DataRelation par programmation, consultez Ajout de DataRelations.

Les relations entre les tables de données apparaissent sous forme de lignes dans le Concepteur de DataSet, avec un glyphe de clé et représentant l’infini, illustrant l’aspect un-à-plusieurs de la relation. Par défaut, le nom de la relation n’apparaît pas sur l’aire de conception.

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 une relation entre deux tables de données

  1. Ouvrez votre dataset dans le Concepteur de DataSet. Pour plus d’informations, consultez Procédure pas à pas : Création d’un jeu de données dans le Concepteur de DataSet.

  2. Faites glisser un objet Relation de la boîte à outils DataSet vers la table de données enfant de la relation.

    La boîte de dialogue Relation s’ouvre, avec la zone Table enfant remplie avec la table sur laquelle vous avez fait glisser l’objet Relation.

  3. Sélectionnez la table parente dans la zone Table parente. La table parente contient des enregistrements du côté « un » d’une relation un-à-plusieurs.

  4. Vérifiez que la table enfant correcte s’affiche dans la zone Table enfant. La table enfant contient des enregistrements du côté « plusieurs » d’une relation un-à-plusieurs.

  5. Tapez un nom pour la relation dans la zone Nom ou conservez le nom par défaut selon les tables sélectionnées. Il s’agit du nom de l’objet DataRelation réel dans le code.

  6. Sélectionnez les colonnes qui joignent les tables dans les listes Colonnes clés et Colonnes de clé étrangère.

  7. Indiquez s’il faut créer une relation, une contrainte ou les deux.

  8. Sélectionnez ou désactivez la zone Relation imbriquée. Si vous sélectionnez cette option, la propriété Nested est définie sur true et les lignes enfants de la relation sont imbriquées dans la colonne parente quand ces lignes sont écrites comme données XML ou synchronisées avec XmlDataDocument. Pour plus d’informations, consultez Imbrication de DataRelations.

  9. Définissez les règles à appliquer quand vous apportez des modifications aux enregistrements dans ces tables. Pour plus d’informations, consultez Rule.

  10. Cliquez sur OK pour créer la relation. Une ligne de relation s’affiche sur le concepteur entre les deux tables.

Pour afficher un nom de relation dans le Concepteur de DataSet

  1. Ouvrez votre dataset dans le Concepteur de DataSet. Pour plus d’informations, consultez Procédure pas à pas : Création d’un jeu de données dans le Concepteur de DataSet.

  2. Dans le menu Données, sélectionnez la commande Afficher les noms des relations pour afficher le nom de la relation. Désactivez cette commande pour masquer le nom de la relation.