我有一个带有两个表的类型化数据集,如下所示:
表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,有没有办法只删除?
答案 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