Cum persistă o structură arborescentă într-un tabel de baze de date cu ID-uri de incrementare automată utilizând un ADO.NET DataSet și un DataAdapter

Am o masă de roluri autoreferențiale care reprezintă o structură arborescentă

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

Folosesc un ADO.NET DataTable și DataAdapter pentru a încărca și a salva valori în acest tabel. Acest lucru funcționează dacă creez copii numai cu rânduri existente. Dacă fac un rând de copii, apoi fac un copil al acelui copil, apoi Actualizare, valoarea ID temporară generată de DataTable intră în coloana ParentID. Am setat următoarea relație de date:

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

Și când fac noi rânduri de copii în DataTable, numesc metoda SetParentRow

newRow.SetParentRow(parentRow)

Există ceva special pe care trebuie să-l fac pentru a genera generația de identificare pentru a se propaga recursiv atunci când sun la Actualizare pe DataAdapter?

0
fr hi bn

3 răspunsuri

Are vreo diferență dacă te duci

newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
0
adăugat

Nu știu în special ADO.net, dar majoritatea ORM-urilor nu vor introduce automat ID-ul unei noi înregistrări într-o relație. Va trebui să recurgeți la procesul în doi pași:

  1. construi și salva părinte
  2. construiți și salvați un copil cu relație cu părintele

Motivul pentru care acest lucru este dificil pentru ORM-uri este că ați putea avea dependențe circulare și nu ar ști ce obiect a avut nevoie pentru a crea un ID pentru prima dată. Unele ORM-uri sunt destul de inteligente pentru a descoperi acele relații în care nu există astfel de dependențe circulare, dar cele mai multe nu sunt.

0
adăugat
ADO.NET este suficient de inteligent pentru a împinge ID-ul părintelui în copil într-un set de date atunci când părintele este actualizat în cazul în care există un set de constrângeri cheie străine - deci trebuie să salvați părintele înaintea copilului, dar nu neapărat să salvați părintele înainte de a crea copilul conectat. Nu este încercat când este auto referențial.
adăugat autor Murph, sursa

Vă sugerez să adăugați un ForeignKeyConstraint, cu UpdateRule setat la Cascade.

0
adăugat