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

Data binding 级联删除不会持久化到我的类型化数据集中的数据库,data-binding,ado.net,dataset,cascade,strongly-typed-dataset,Data Binding,Ado.net,Dataset,Cascade,Strongly Typed Dataset,Net中的类型化数据集应该能够在两个表(例如父表和子表)之间建立数据关系时级联删除和更新。然而,我一直无法让这项工作。我应该澄清:它在记忆中对我有用;但它不会持久保存到数据库中 我在数据库中设置了一个包含两个表的测试项目:颜色和方框。每个都有一个ID主键和一个名称,例如BoxId、BoxName。颜色是父和框,它还有一个标有外键约束的ColorId字段。然后我设置了一个Winform,上面有两个DataGridView,每个表一个。我将这两个表拖到一个新的数据集中,它们的关系出现在设计器中。我将

Net中的类型化数据集应该能够在两个表(例如父表和子表)之间建立数据关系时级联删除和更新。然而,我一直无法让这项工作。我应该澄清:它在记忆中对我有用;但它不会持久保存到数据库中

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

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

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


这让人恼火,因为我唯一的选择似乎就是自己编写引用完整性代码,la使用存储过程执行颜色删除,在其中我还执行框删除,或在SQL Server上按删除级联排序,甚至在Colors delete语句中放入内联框删除。我一直回到我的模型中的DataRelation对象应该为我处理这个事实。显然BindingSource对象得到了它,因为它们正在从子网格中删除相关行。但是为什么模型不先对box表执行删除,然后再对Colors表执行删除?

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

this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);
this.colorsTableAdapter.Update(this.pOCDataSet.Colors);
希望这有帮助