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

StackOverflow https://stackoverflow.com/questions/5263

  •  08-06-2019
  •  | 
  •  

Question

J'ai une table de rôles auto-référentielle qui représente une arborescence

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 crée uniquement des enfants de lignes existantes.Si je crée une ligne enfant, puis que je crée un enfant de cet enfant, puis mettez à jour, la valeur d'ID temporaire générée par 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 ?

Était-ce utile?

La solution

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 sauver un enfant en relation avec ses parents

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 avait besoin de créer un identifiant en premier.Certains ORM sont suffisamment intelligents pour comprendre les relations dans lesquelles de telles dépendances circulaires n'existent pas, mais la plupart ne le sont pas.

Autres conseils

Est-ce que ça fait une différence si tu y vas

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top