Je vous suggère d'ajouter un ForeignKeyConstraint, avec UpdateRule défini sur Cascade.
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 ?
Je vous suggère d'ajouter un ForeignKeyConstraint, avec UpdateRule défini sur Cascade.
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 :
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.