Announcement

Collapse
No announcement yet.

Problem mit n:n-Beziehung und DataTable-Events

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit n:n-Beziehung und DataTable-Events

    Hallo,

    um mein Problem zu erläutern, hier zunächst die Ausgangslage:
    Auf Datenbankebene existiert eine Tabelle, deren Zeilen über eine Primärschlüsselspalte PK eindeutig definiert sind. Nun soll ein Eintrag mit beliebig vielen anderen Einträgen der gleichen Tabelle verknüpft werden können, so dass ich eine einfache LookUp-Tabelle erstellt habe, die die Spalten PK1 und PK2 enthält, es handelt sich also um eine n:n Beziehung. Um diese Beziehung beidseitig zu definieren, werden für eine Verknüpfung jeweils zwei Zeilen eingetragen (z.B. {1,2} und {2,1}).

    Für die Abbildung in ADO.NET (in Visual Studio 2005) habe ich zwei DataTables der Datentabelle sowie eine DataTable der LookUp-Tabelle erstellt. Einfache Beziehungen (ohne foreign keys) sind wie folgt angelegt: DataTable1/PK auf LookUpTable/PK1 und DataTable2/PK auf LookUpTable/PK2.
    Die Tabellen werden entsprechend über TableAdapter gefüllt. Zur Darstellung auf einem Windows Form beinhaltet dieses ein BindingNavigator, mit dem durch die Daten der DataTable1 navigiert werden kann und ein DataGridView, welches die Inhalte der LookUpTable (PK2 + verknüfte Informationen aus der DataTable2) für den aktuellen Eintrag darstellt.

    Wird nun vom Benutzer ein neuer Eintrag in der Lookup-Tabelle für PK2 vorgenommen, dann muss programmatisch sichergestellt werden, dass auch ein entsprechend "gedrehter" Eintrag erzeugt wird. Dies erledige ich im DataTable.RowChanged Event (RowState = Add). Auch bei Änderung eines Wertes von PK2 muss natürlich der passende "gedrehte" Eintrag mit geändert werden, was ich im DataTable.RowChanging (RowState = Changed) realisiere, wo die current und proposed Werte verfügbar sind.
    Ein Problem habe ich jedoch beim Löschen eines Eintrages aus der LookupTable: das DataTable.RowDeleted Ereignis kann nicht verwendet werden, da die Werte für PK1 und PK2 nicht mehr verfügbar sind (zumindest nur die Original Werte seit dem letzten TableAdapter.Fill). Im DataTable.RowDeleting Ereignis sind diese Werte noch verfügbar, aber ein Löschen der korrespondierenden "gedrehten" Zeile löst erneut das Ereignis aus und erzeugt einen Fehler. Ob das Löschen der Zeile bereits gestartet wurde lässt sich an dieser Stelle auch nicht abfragen, da RowState = unchanged ist.

    Kann jemand sagen, wie in solchen Fällen die von .NET angedachte Vorgehensweise ist? Gibt es vielleicht andere Implementationen von n:n Beziehungen auf die gleiche Tabelle, die dieses Problem vermeidet?

    Vielen Dank im voraus für eure Antworten,
    Hannes
Working...
X