типизированный набор данных, каскадное удаление записей дочерней таблицы - PullRequest
1 голос
/ 05 мая 2011

У меня есть набор данных с двумя таблицами, подобными этим:

Таблица A (Родительская таблица)

ID  MessageID   
1     1
2     1
3     2
4      3

Таблица B (дочерняя таблица)

ID  MessageID   
1     1
2     2
3     3

У меня есть связь между таблицей A и таблицей B в столбце MessageID.Правило удаления установлено в Каскад.Я не могу изменить дизайн этих таблиц, это то, что есть.

Таблица A содержит две записи с MessageID 1. Если я удаляю только одну из них, дочерняя запись удаляется из таблицы B, создавая сиротуво второй родительской таблице.Есть ли способ удалить только если нет родительских записей, совместно использующих MessageID?

1 Ответ

1 голос
/ 05 мая 2011

Вы можете создать триггер вместо каскадного удаления, например (MS SQL-сервер, не проверено):

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)))))

Другая идея заключается в расширении вашего набранного набора данных.Если вы хотите расширить функциональность, вы не можете изменить сгенерированные классы в DatesetName.designer.cs / vb (он будет воссоздан при любом изменении), но файл без дизайнера в его имени (создайте его, если он не существует).Затем вам нужно расширить частичный класс DataTable (посмотрите в файле конструктора, если вы не знаете точного имени, обычно это TableBDataTable ).

Посмотрите на следующеекод, чтобы увидеть, что я имею в виду, я не проверял это, но я надеюсь, что вы поняли мою точку зрения:

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
...