0

ADO.Net中的类型数据集应该能够级联删除和更新,当两个表(如父母和子女)之间建立DataRelation时。但是我一直无法得到这个工作。我应该澄清一下:它适用于我的内存;但它不会保存到数据库中。级联删除不会保留到我的输入数据集中的数据库

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

当我运行窗体和SQL事件探查器时,我看到了所有数据,我可以删除孩子中的物品(Boxes)没有问题。这些删除操作也会在数据库中生成一个DELETE。 EXCELENTE。当我在顶部网格(Colors)中进行删除时,我删除的行消失,并且Boxes网格中的行也消失(假设我在数据库中NOCHECK FK约束)。这看起来不错。但是,在剖析器中,显然只有Colors DELETE语句运行。 Boxes行是孤立的。除非重新启动应用程序,否则在Winform上不会看到这一点,此时,Boxes中将被删除的行将显示一个红色感叹号图标,表示它们违反FK约束。

这是令人生气的,因为它看起来像我唯一的选择是编写自己的参考完整性的东西,使用存储过程执行一个颜色删除(其中我也做盒删除),或者在SQL Server上命令ON DELETE CASCADE,或者甚至将内联Box删除到Colors delete语句中。我一直回到我的模型中的DataRelation对象应该为我处理这个事实。很显然,BindingSource对象获取它,因为它们正在从子网格中移除相关的行。但是,为什么模型不是首先执行删除对盒框表和颜色表?

回答

0

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

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

希望这有助于。

相关问题