【问题标题】:typed dataset, cascade delete of child table records类型化数据集,级联删除子表记录
【发布时间】:2011-08-18 20:34:24
【问题描述】:

我有一个包含两个这样的表的类型化数据集:

表 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 时才删除?

【问题讨论】:

    标签: .net strongly-typed-dataset relation


    【解决方案1】:

    您可以创建一个trigger,而不是级联删除,例如(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
    

    【讨论】:

    • 我正在尝试仅在数据集中执行此操作。我不打算用这些更改来更新 SQL。 (我不会让你厌烦原因)
    • 删除规则也在数据库端。然后,您只能选择删除 cascade-delete 并在应用程序中检查是否必须删除子项。
    • 这就是我所担心的。谢谢。
    • @Bremer:我有另一个想法并编辑了我的答案,看看。
    • 我自己提出了相同的解决方案,效果很好!实际上,我在一个使用数据集的类中添加了我的事件处理程序代码。您在部分班级中的位置甚至更好。谢谢!
    猜你喜欢
    • 2014-01-13
    • 2014-06-01
    • 1970-01-01
    • 2016-11-05
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多