对XSD创建的数据集强制执行孤立删除

时间:2018-02-01 09:45:52

标签: c# xsd dataset delete-row cascading-deletes

在我的DataSet中,我有两个来自的表和带有XSD定义的XML:

  • 注册
  • 类型

一对多关系

<xs:keyref name="RegisterForeingKey" refer="myXsd:TypeKey">
  <xs:selector xpath="Register"/>
  <xs:field xpath="TypeID"/>
</xs:keyref>

这意味着寄存器有一个类型,许多寄存器可以引用一个类型。

当我删除一个寄存器时,我想清除相关的类型,如果它是孤立的(清除没有关联的类型)。 msdata:DeleteRule="Cascade"是最佳选择吗?

有人能为我提供一个如何在XSD上实现它的简单示例吗?

我尝试将此添加到关系

<xs:keyref name="RegisterForeingKey" refer="myXsd:TypeKey" msdata:DeleteRule="Cascade" msdata:EnforceConstraints="true">
  <xs:selector xpath="Register"/>
  <xs:field xpath="TypeID"/>
</xs:keyref>

并将其删除为dataSrc.Tables["Register"].Rows.RemoveAt(rowIndex); dataSrc.AcceptChanges();

但它没有清理孤儿

1 个答案:

答案 0 :(得分:0)

在阅读了这件事之后,我意识到了一些事情,我将在这里帮助那些遇到与我同样困难的人。

  • Cascade默认定义
  • Cascade仅适用于Top to Bottom,这意味着只有删除父级才有效,然后它会自动删除与他关联的子级
  • 删除一行后需​​要dataset.AcceptChanges(),以便将行从数据集中分离出来

在OP中我试图以相反的方向使用Cascade,当删除一个Type的最后一个Register时,删除Type以使它不会保持孤立状态。 Cascade根本无法正常工作。

因此,我的最终解决方案是:

DataRow registerRow = dataSrc.Tables["Register"].Rows[rowIndex];
DataRow typeRow = registerRow.GetParentRow(dataSrc.Relations["RegisterForeingKey"]);
DataRow[] typeChilds = typeRow.GetChildRows(dataSrc.Relations["RegisterForeingKey"]);

if (typeChilds.Length > 1)
{
    // There are more Registers with the same Parent Type
    registerRow.Delete();
}
else
{
    // Last Register of this Type, delete it and the rest will be deleted by Cascade
    typeRow.Delete();
}

dataSrc.AcceptChanges();

如果我说错了,或者我的解决方案可以改进,请纠正我。