Come si fa a mantenere una struttura ad albero di una tabella di database con incremento automatico Id usando un ADO.NET DataSet e un DataAdapter
Domanda
Ho un auto-referenziale Ruolo la tabella che rappresenta una struttura ad albero
ID [INT] AUTO INCREMENT
Name [VARCHAR]
ParentID [INT]
Sto utilizzando un ADO.NET DataTable e DataAdapter per caricare e salvare i valori di questa tabella.Questo funziona se creo solo i bambini delle righe esistenti.Se ho un bambino di riga, quindi fare un bambino del bambino, quindi Aggiornare la temporanea valore di ID generato dal DataTable è andare in ParentID colonna.Ho i seguenti dati relazione impostare:
dataset.Relations.Add(New DataRelation("RoleToRole",RoleTable.Columns("ID"), RoleTable.Columns("ParentID")))
E quando faccio nuovo bambino righe nel DataTable che io chiamo il metodo SetParentRow
newRow.SetParentRow(parentRow)
C'è qualcosa di particolare che devo fare per ottenere la generazione di ID di propagare in modo ricorsivo quando chiamo Aggiornamento DataAdapter?
Soluzione
Non so ADO.net in particolare, ma la maggior parte degli Orm non inserire automaticamente l'ID di un nuovo record in una relazione.Dovrete ricorrere al 2 fasi:
- creare e salvare un genitore
- creare e salvare il bambino con il rapporto genitore
La ragione di che questo è difficile per Orm è perché si potrebbe avere dipendenze circolari, e non so quale oggetto è necessario per creare un ID per primo.Alcuni Orm sono abbastanza intelligente per capire quei rapporti dove non esistono dipendenze circolari, ma la maggior parte non lo sono.
Altri suggerimenti
Fa differenza se si va
newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
Vi suggerisco di aggiungere un ForeignKeyConstraint, con UpdateRule insieme a Cascata.