m:n-Beziehung mit Listenfeld

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Wir haben in der Beispieldatenbank Bestellverwaltung bereits eine m:n-Beziehung über ein Fenster realisiert, das an eine Tabelle gebunden ist und ein DataGrid enthält, das die verknüpfte Elemente anzeigt. Dabei handelt es sich um die Abbildung von Bestellungen, Bestelldetails und Produkte, wo zusätzlich zur Verknüpfung noch weitere Daten wie der Einzelpreis für die Bestellposition gespeichert werden. Im vorliegenden Artikel werden wir uns ansehen, wie wir eine m:n-Beziehung ohne weitere Daten in der Verknüpfungstabelle verwalten können. Dazu wollen wir Kunden über eine Verknüpfungstabelle einer Tabelle mit Versendungen etwa zu Werbe- oder Informationszwecken verknüpfen.

Notwendige Tabellen/Erweiterungen

Die Datenbank Bestellverwaltung.db auf Basis von SQLite, die wir in den bisherigen Beispielen verwendet haben, müssen wir für diesen Artikel um zwei Tabellen erweitern.

Das erledigen wir schnell über das Verwaltungsprogramm SQLite Studio, mit dem wir die Datei Bestellverwaltung.db öffnen und als Erstes die Tabelle Versendungen anlegen – und zwar mit den Feldern wie in Bild 1. Speichern Sie die Tabelle nach dem Anlegen der Felder und des Tabellennamens mit einem Klick auf die Schaltfläche Commit structure changes.

Anlegen der neuen Tabelle Versendungen

Bild 1: Anlegen der neuen Tabelle Versendungen

Danach folgt die zweite Tabelle KundenVersendungen als Verknüpfungstabelle. Diese Tabelle enthält neben dem Primärschlüsselfeld ID noch die beiden Fremdschlüsselfelder KundeID und VersendungID, welche die beiden Tabellen Kunden und Versendungen referenzieren.

Wenn Sie die Fremdschlüsselfelder anlegen, aktivieren Sie im Dialog Spalte die Option Fremdschlüssel und klicken dann auf die Schaltfläche Konfigurieren. Dies zeigt den Dialog Bedingung editieren an, wo Sie als Fremde Tabelle die Tabelle Kunden und als Fremde Spalte die Spalte ID auswählen (siehe Bild 2). Hier aktivieren Sie außerdem die Option ON DELETE und wählen dafür die Aktion CASCADE aus.

Anlegen der neuen Tabelle KundenVersendungen

Bild 2: Anlegen der neuen Tabelle KundenVersendungen

Dies bewirkt, dass wenn Sie einen Datensatz der Tabelle Kunden löschen, für den in der Tabelle KundenVersendungen verknüpfte Datensätze vorliegen, diese auch gelöscht werden. Das Gleiche führen wir auch für das Fremdschlüsselfeld zum Verknüpfen mit der Tabelle Versendungen durch. Speichern Sie die Tabelle mit der Schaltfläche Commit structure changes.

Danach legen wir noch einen zusammengesetzten, eindeutigen Schlüssel für die beiden Fremdschlüsselfelder KundeID und VersendungID an, damit jede Versendung jedem Kunden nur einmal zugeordnet werden kann. Dazu klicken Sie oben über dem Tabellenentwurf auf den Reiter Indizes.

Klicken Sie dann auf die Schaltfläche Create index (ins). Dann tragen Sie im nun erscheinenden Dialog Index den Wert KundenVersendungenUniqueIndex als Name ein. Wählen Sie die beiden Felder KundeID und VersendungID aus und aktivieren Sie die Option Einzigartiger Index (okay, die Übersetzung ist zumindest gut gemeint von den Entwicklern des Tools). Dies soll dann wie in Bild 3 aussehen, bevor Sie auf OK klicken und anschließend das Anlegen des Indizes bestätigen.

Anlegen eines zusammengesetzten, eindeutigen Schlüssels über die beiden Felder KundeID und VersendungID

Bild 3: Anlegen eines zusammengesetzten, eindeutigen Schlüssels über die beiden Felder KundeID und VersendungID

Änderungen im Entity Data Model

Nachdem Sie die beiden neuen Tabellen angelegt haben, benötigen wir in der Anwendung die entsprechenden Entitäten für die beiden Tabellen. Dazu öffnen Sie die Anwendung Bestellverwaltung und klicken im Projekt-Explorer doppelt auf das Objekt Bestellverwaltung.edmx.

Klicken Sie mit der rechten Maustaste in das Diagramm und wählen Sie aus dem Kontextmenü den Eintrag Modell aus der Datenbank aktualisieren… aus. Gegebenenfalls müssen Sie nun die Verbindung für das Entity Data Model festlegen. Danach erscheint dann der Dialog, der auch beim Erstellen eines Entity Data Models angezeigt wird. Hier wählen Sie die beiden einzigen angezeigten Tabellen KundenVersendungen und Versendungen aus und klicken auf Fertig stellen.

Danach sollten die neuen Tabellen wie in Bild 4 im Entity Data Model angezeigt werden, sodass wir nun darauf zugreifen können. Genau wie bei den übrigen Entitäten haben wir auch bei diesen beiden Entitäten die Benennung in den Singular geändert, also von KundenVersendungen auf KundeVersendung und von Versendungen auf Versendung.

Die beiden neuen Entitäten im Entity Data Model, hier bereits in der Singular-Benennung

Bild 4: Die beiden neuen Entitäten im Entity Data Model, hier bereits in der Singular-Benennung

Wenn Sie nun noch den neuen Zustand etwa mit der Tastenkombination Strg + S speichern, werden auch die dahinter liegenden Objekte umbenannt.

Fenster zum Zuordnen von Kunden und Versendungen

Das Fenster, in dem wir einer Versendung die entsprechenden Kunden zuordnen wollen, soll im oberen Bereich ein Kombinationsfeld enthalten, welches die Versendungen abbildet. Im unteren Bereich wollen wir zwei Listenfelder darstellen. Das linke enthält alle Kunden, die der Versendung bereits zugeordnet wurden und das rechte als übrigen Kunden. Dazwischen platzieren wir vier Schaltflächen für die folgenden Funktionen:

  • <: Den aktuell markierten Kunden aus dem rechten Listenfeld zur Liste der Empfänger hinzufügen.
  • >: Den aktuell markierten Kunden aus dem linken Listenfeld aus der Liste der Empfänger entfernen.
  • <<: Alle Kunden aus dem rechten Listenfeld zur Liste der Empfänger hinzufügen.
  • >>: Alle Kunden aus dem linken Listenfeld aus der Liste der Empfänger entfernen.

Fenster anlegen

Das neue Fenster wollen wie diesmal einmal nicht in die bestehende Struktur einbinden, sondern über den Ribbon-Eintrag Versendungen als eigenes Fenster öffnen. Das Fenster legen Sie im Projekt unter dem Namen Versendungen.xaml an. Dem Fenster MainWindow.xaml fügen wir eine neue Ribbon-Schaltfläche wie in Bild 5 hinzu. Der Code dafür sieht wie folgt aus:

 

Schreibe einen Kommentar