30 Comment conserver une structure arborescente dans une table de base de données avec des ID à incrémentation automatique à l'aide d'un DataSet ADO.NET et d'un DataAdapter

J'ai une table de rôle auto-référentielle qui représente une structure arborescente

ID [INT] AUTO INCREMENT
Name [VARCHAR]
ParentID [INT]

J'utilise un DataTable et un DataAdapter ADO.NET pour charger et enregistrer des valeurs dans cette table. Cela fonctionne si je ne crée que des enfants de lignes existantes. Si je crée une ligne enfant, puis crée un enfant de cet enfant, puis met à jour, la valeur d'ID temporaire générée par le DataTable va dans la colonne ParentID. J'ai l'ensemble de relations de données suivant :

dataset.Relations.Add(New DataRelation('RoleToRole',RoleTable.Columns('ID'), RoleTable.Columns('ParentID')))

Et quand je crée de nouvelles lignes enfants dans le DataTable, j'appelle la méthode SetParentRow

newRow.SetParentRow(parentRow)

Dois-je faire quelque chose de spécial pour que la génération d'ID se propage de manière récursive lorsque j'appelle Update sur le DataAdapter ?

请先 登录 后评论

2 réponses

James A. Rosen

Je ne connais pas ADO.net en particulier, mais la plupart des ORM n'insèrent pas automatiquement l'ID d'un nouvel enregistrement dans une relation. Vous devrez recourir au processus en 2 étapes :

  1. construire et enregistrer le parent
  2. construire et enregistrer l'enfant avec une relation avec le parent

La raison pour laquelle cela est difficile pour les ORM est que vous pourriez avoir des dépendances circulaires et qu'il ne saurait pas pour quel objet il doit créer un ID en premier. Certains ORM sont assez intelligents pour comprendre les relations où il n'y a pas de telles dépendances circulaires, mais la plupart n'en ont pas.

请先 登录 后评论
Joe

Je vous suggère d'ajouter un ForeignKeyConstraint, avec UpdateRule défini sur Cascade.

请先 登录 后评论