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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top