1

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

表 A(父表)

ID  MessageID   
1     1
2     1
3     2
4      3

表 B(子表)

ID  MessageID   
1     1
2     2
3     3

我在 MessageID 列上有表 A 和表 B 之间的关系。删除规则设置为级联。我不能改变这些桌子的设计,它就是这样。

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

4

1 回答 1

1

您可以创建触发器而不是级联删除,例如(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 类(如果你不知道确切的名称,请查看设计器文件,它通常是 fe 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
于 2011-05-04T20:26:52.510 回答