Wie tun Sie bleiben eine Baum-Struktur in eine Datenbank-Tabelle mit auto-increment IDs mit ein ADO.NET DataSet und ein DataAdapter
Frage
Ich habe eine selbst-referenzielle Rolle Tabelle, stellt eine Baum-Struktur
ID [INT] AUTO INCREMENT
Name [VARCHAR]
ParentID [INT]
Ich bin mit einem ADO.NET DataTable und DataAdapter, zu laden und speichern von Werten in dieser Tabelle.Dies funktioniert, wenn ich nur erstellen die Kinder der vorhandenen Zeilen.Wenn ich ein Kind Zeile, dann ein Kind, das Kind, dann Aktualisieren Sie die temporäre ID-Wert generiert, indem die DataTable wird in die ParentID-Spalte.Ich habe die folgenden Daten relation gesetzt:
dataset.Relations.Add(New DataRelation("RoleToRole",RoleTable.Columns("ID"), RoleTable.Columns("ParentID")))
Und wenn ich neue untergeordnete Zeilen in der DataTable, nenne ich das SetParentRow Methode
newRow.SetParentRow(parentRow)
Ist es etwas besonderes, ich habe zu tun, um die ID-Generierung zu verbreiten rekursiv, wenn ich Update aufrufen, auf der DataAdapter?
Lösung
Ich weiß nicht, ADO.net insbesondere aber die meisten ORMs nicht automatisch, legen Sie die ID eines neuen Datensatzes in eine Beziehung.Sie müssen resort auf die 2-Schritt-Prozess:
- erstellen und speichern Eltern
- erstellen und speichern Sie Kind-Beziehung zu Eltern
Der Grund, dass dies schwierig für ORMs ist, da Sie möglicherweise zirkuläre Abhängigkeiten, und es würde nicht wissen, welches Objekt es benötigt, um erstellen Sie eine ID für das erste.Einige ORMs sind schlau genug um jene Beziehungen, in denen es keine solche zirkulären Abhängigkeiten, aber die meisten nicht.
Andere Tipps
Macht es einen Unterschied, wenn Sie gehen
newRow.SetParentRow(parentRow, RoleTable.Relations("RoleToRole"))
Ich schlage vor, Sie fügen Sie eine ForeignKeyConstraint, mit UpdateRule set to Cascade.