【问题标题】:Cascading Deletes Do Not Persist to the Database in my Typed Dataset级联删除不会持续存在于我的类型化数据集中的数据库中
【发布时间】:2011-08-13 23:46:45
【问题描述】:

当在两个表(例如父表和子表)之间设置 DataRelation 时,ADO.Net 中的类型化数据集应该能够级联删除和更新。但是我无法让它工作。我应该澄清一下:它在内存中对我有用;但它不会持久化到数据库中。

我在我的数据库中设置了一个包含两个表的测试项目:颜色和框。每个都有一个 ID 主键和一个名称(例如“BoxId,BoxName”)。 Colors 是父级,Boxes 也有一个用外键约束标记的 ColorId 字段。然后我设置了一个 Winform,上面有两个 DataGridView,每个表一个。我把两张表拖进了一个新的Dataset,他们的关系出现在了设计器中。我将关系编辑为“外键和关系”,并将所有 3 个参照完整性选项设置为“级联”(即 DeleteRule、UpdateRule、AcceptRejectChanges)。我还为 Boxes 表创建了一个 DeleteCommand,因为出于某种原因设计者拒绝这样做。最后,我在每个网格旁边放置一个按钮进行保存,并在每个网格的事件处理程序中调用 Update()(例如 this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);

当我运行表单和 SQL Profiler 时,我看到了我的所有数据,并且我可以删除子项(框)中的项目没问题。这些删除也会在数据库中生成一个 DELETE。非常好。

当我在顶部网格(颜色)中进行删除时,我删除的行消失了,Boxes 网格中的行也消失了(假设我 NOCHECK 数据库中的 FK 约束)。这看起来很棒。但是,在分析器中,显然只运行了 Colors DELETE 语句。 Boxes 行是孤立的。除非您重新启动应用程序,否则您不会在 Winform 上看到这一点,此时 Boxes 中将被删除的行在其左侧出现一个红色感叹号图标,表示它们违反了 FK 约束。

这很令人抓狂,因为我唯一的选择似乎就是自己编写参照完整性的代码,例如使用存储的过程来执行颜色删除(在其中我还会执行 Boxes 删除),或者在 SQL Server 上订购 ON DELETE CASCADE,甚至在颜色删除语句中放置内联框删除。我不断回到这样一个事实,即我的模型中的 DataRelation 对象应该为我处理这个问题。显然 BindingSource 对象得到了它,因为它们正在从子网格中删除相关行。但是,为什么模型不先对 Boxes 表执行 Deletes,然后对 Colors 表执行删除操作呢?

【问题讨论】:

    标签: data-binding ado.net dataset cascade strongly-typed-dataset


    【解决方案1】:

    删除数据集中的行只会将它们标记为在您的数据集中删除;您仍然必须为要从中删除数据的数据库中的每个表使用表适配器。您可以将数据集视为您在内存中的数据库版本。这些更改需要以正确的顺序提交到数据库,以防止 FK 错误。在您的情况下,您需要在所有子表(框)的删除都像这样提交之后运行父表(颜色)的更新语句......

    this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);
    this.colorsTableAdapter.Update(this.pOCDataSet.Colors);
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 2016-09-28
      • 2014-01-13
      • 1970-01-01
      • 2012-06-24
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多