级联删除不会保留在我键入的数据集中的数据库

|| 当在两个表(例如父表和子表)之间建立DataRelation时,ADO.Net中的类型化数据集应该能够级联删除和更新。但是,我无法使它正常工作。我应该澄清一下:它在内存中对我有用;但它不会持久化到数据库中。 我在数据库中建立了一个包含两个表的测试项目:“颜色”和“框”。每个都有一个ID主键和一个名称(例如\“ BoxId,BoxName \”)。 Colors是父元素,Boxs是Boxes,Boxs还具有用外键约束标记的ColorId字段。然后,我设置了一个带有两个DataGridViews的Winform,每个表一个。我将两个表拖到新的数据集中,它们的关系出现在设计器中。我将关系编辑为\“ Foreign Key and Relation \”,并将所有3个参照完整性选项都设置为\“ Cascade \”(即DeleteRule,UpdateRule,AcceptRejectChanges)。我还为Boxes表创建了DeleteCommand,因为设计者出于某种原因拒绝这样做。最后,我在每个网格旁边放置一个按钮进行保存,然后在每个事件的事件处理程序中添加Update()调用(例如
this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);
) 当我运行窗体和SQL事件探查器时,我看到了所有数据,并且可以删除子级(框)中的项目没有问题。这些删除也会在数据库中生成DELETE。出色。 当我在顶部网格(颜色)中执行删除操作时,我删除的行消失了,并且“框”网格中的行也消失了(假设我不检查数据库中的FK约束)。这看起来很棒。但是,在分析器中,显然只有Colors DELETE语句运行了。框行是孤立的。除非您重新启动应用程序,否则您不会在Winform上看到此情况,这时框中要删除的行将在左侧显示一个红色的感叹号图标,表明它们违反了FK约束。 这很令人发疯,因为肯定可以确定,我唯一的选择是自己编写参考完整性材料,使用存储的proc进行Colors删除(在其中我也要进行Boxes删除),或者命令ON在SQL Server上删除CASCADE,甚至将内联Boxes删除放入Colors delete语句中。我继续回到一个事实,即我模型中的DataRelation对象应该为我处理这个问题。显然,BindingSource对象可以获取它,因为它们正在从子网格中删除相关的行。但是,为什么模型不首先对Boxes表然后对Colors表执行Delete?     
已邀请:
删除数据集中的行只会将其标记为要在您的数据集中删除;您仍然必须为要从中删除数据的数据库中的每个表使用表适配器。您可以将数据集视为内存中数据库的版本。这些更改需要以正确的顺序提交给数据库,以防止FK错误。在您的情况下,您需要为子表(颜色)的所有删除操作提交后,为父表(颜色)运行update语句,就像这样...
this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);
this.colorsTableAdapter.Update(this.pOCDataSet.Colors);
希望这可以帮助。     

要回复问题请先登录注册