typisierter Datensatz, Kaskadenlöschung von untergeordneten Tabellendatensätzen
-
28-10-2019 - |
Frage
Ich habe einen typisierten Datensatz mit zwei Tabellen wie dieser:
Tabelle A (übergeordnete Tabelle)
ID MessageID
1 1
2 1
3 2
4 3
Tabelle B (untergeordnete Tabelle)
ID MessageID
1 1
2 2
3 3
Ich habe eine Beziehung zwischen Tabelle A und Tabelle B in der Spalte MessageID.Die Löschregel ist auf Kaskade gesetzt.Ich kann das Design dieser Tabellen nicht ändern, es ist das, was es ist.
Tabelle A enthält zwei Datensätze mit MessageID 1. Wenn ich nur einen davon lösche, wird der untergeordnete Datensatz aus Tabelle B gelöscht, wodurch eine Waise in der zweiten übergeordneten Tabelle erstellt wird.Gibt es eine Möglichkeit, nur zu löschen, wenn keine anderen übergeordneten Datensätze die MessageID gemeinsam nutzen?
Lösung
Sie können stattdessen einen Trigger erstellendes Kaskadenlöschens zum Beispiel (MS SQL-Server, ungetestet):
CREATE TRIGGER [dbo].[trDeleteTableB] ON [dbo].[TableA]
FOR DELETE
AS
DELETE FROM TableB
WHERE (MessageID IN
(SELECT MessageID
FROM DELETED
WHERE (NOT EXISTS
(SELECT * FROM TableA
WHERE (TableA.MessageID = DELETED.MessageID)))))
Eine andere Idee ist es, Ihren eingegebenen Datensatz zu erweitern.Wenn Sie die Funktionalität erweitern möchten, können Sie die generierten Klassen in DatesetName.designer.cs / vb nicht ändern (sie werden bei jeder Änderung neu erstellt), aber die Datei ohne Designer im Namen (erstellen Sie sie, wenn sie nicht vorhanden ist).Dann müssen Sie die partielle DataTable-Klasse erweitern (schauen Sie in die Designer-Datei, wenn Sie den genauen Namen nicht kennen, es ist normalerweise f.e. TableBDataTable ).
Schauen Sie sich den folgenden Code an, um zu sehen, was ich meine. Ich habe ihn nicht getestet, aber ich hoffe, Sie verstehen meinen Standpunkt:
Partial Class Datset1
Partial Class TableBDataTable
Private Sub TableB_RowDeleting(ByVal sender As Object, ByVal e As TableBRowChangeEvent) Handles Me.TableBRowDeleting
If e.Action = DataRowAction.Delete Then
'*** check here if there is another TableARow with this MessageID ***'
e.Row.RejectChanges()
End If
End Sub
End Class
End Class