级联删除不会持久保存到我的类型化数据集中的数据库

时间:2011-04-27 15:45:11

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

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

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

当我运行表单和SQL事件探查器时,我看到了我的所有数据,我可以删除子项(Boxes)中的项目没问题。这些删除也会在数据库中生成DELETE。 EXCELENTE。

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

这很令人抓狂,因为这看起来我唯一的选择就是自己编写参照完整性内容,使用存储过程来执行颜色删除(在其中我也会删除Boxes),或者在SQL Server上排序ON DELETE CASCADE,甚至在Colors delete语句中删除内联Box。我一直回到我的模型中的DataRelation对象应该为我处理这个事实。很明显,BindingSource对象可以获取它,因为它们正在从子网格中删除相关的行。但是为什么模型首先不对Boxes表执行Deletes,然后是Colors表呢?

1 个答案:

答案 0 :(得分:0)

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

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

希望这有帮助。