在我的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();
但它没有清理孤儿
答案 0 :(得分:0)
在阅读了这件事之后,我意识到了一些事情,我将在这里帮助那些遇到与我同样困难的人。
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();
如果我说错了,或者我的解决方案可以改进,请纠正我。