类型化数据集,级联删除子表记录

时间:2011-05-04 20:10:57

标签: .net strongly-typed-dataset relation

我有一个带有两个表的类型化数据集,如下所示:

表A(父表)

ID  MessageID   
1     1
2     1
3     2
4      3

表B(子表)

ID  MessageID   
1     1
2     2
3     3

我在MessageID列上的表A和表B之间存在关系。删除规则设置为Cascade。我无法改变这些表的设计,它就是它。

表A包含两条带有MessageID 1的记录。如果我只删除其中一条记录,则从表B中删除子记录,在第二个父表中创建一个孤立。如果没有其他父记录共享MessageID,有没有办法只删除?

1 个答案:

答案 0 :(得分:1)

您可以创建trigger而不是cascade-delete,例如(MS SQL-Server,未经测试):

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类(如果你不知道确切的名字,请查看设计器文件,通常是f.e. 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