2008-08-07 7 views
4

Ich habe eine selbstbezüglicher Rollentabelle, die eine BaumstrukturWie gehen Sie mit Auto Erhöhen IDs eine Baumstruktur zu einer Datenbanktabelle beharren ein ADO.NET DataSet und Dataadapter

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

Ich verwende repräsentiert eine ADO.NET DataTable und DataAdapter zum Laden und Speichern von Werten in dieser Tabelle. Dies funktioniert, wenn ich nur untergeordnete Zeilen bestehender Zeilen erzeuge. Wenn ich eine untergeordnete Zeile mache, dann ein untergeordnetes Element dieses untergeordneten Elements und dann Update, wird der von der DataTable generierte temporäre ID-Wert in die ParentID-Spalte übernommen. Ich habe folgende Daten Relation Satz:

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

Und wenn ich neue Kind Zeilen in der Datatable machen nenne ich die SetParentRow Methode

newRow.SetParentRow(parentRow) 

Gibt es etwas Besonderes Ich habe zu tun, um die ID-Erzeugung zu erhalten rekursiv zu propagieren, wenn ich Update auf dem DataAdapter aufrufen?

Antwort

1

gehen, weiß ich nicht ADO.net insbesondere, aber die meisten ORMs wird die ID eines neuen Datensatzes in einer Beziehung nicht automatisch einfügen. Sie werden auf die 2-Schritt-Verfahren zurückgreifen:

  1. bauen und Eltern
  2. Build speichern und mit Beziehung

Der Grund zu Eltern-Kind zu retten, dass dies für ORMs schwierig ist, liegt daran, Sie haben möglicherweise zirkuläre Abhängigkeiten und wissen nicht, welches Objekt für die Erstellung einer ID benötigt wird. Einige ORMs sind schlau genug, um solche Beziehungen herauszufinden, in denen es keine solchen zirkulären Abhängigkeiten gibt, aber die meisten nicht.

+0

ADO.NET ist intelligent genug, um die Eltern-ID in das untergeordnete Element in einem Dataset zu schieben, wenn das übergeordnete Element aktualisiert wird, wenn ein Fremdschlüsselbeschränkungssatz vorhanden ist. Daher müssen Sie das übergeordnete Element vor dem untergeordneten Element speichern, aber nicht unbedingt das übergeordnete Element bevor Sie das verknüpfte Kind erstellen. Nicht versucht, wenn selbstreferenziell. – Murph

0

Macht es einen Unterschied machen, wenn Sie

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

Ich schlage vor, Sie eine ForeignKeyConstraint hinzufügen, mit UpdateRule auf Cascade festgelegt.