在我的DataSet中,有两个来自XSD定义的表和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();
但它不能清洁孤儿
发布于 2018-02-01 11:26:21
在阅读了这件事之后,我意识到了一些事情,我会让它们在这里帮助那些和我一样困难的人。
dataset.AcceptChanges(),以便将行从数据集中分离出来。在OP中,我试图在相反的方向上使用级联,当删除最后一个类型寄存器时,删除Type,这样它就不会成为孤儿。级联根本不是这样工作的。
因此,我的最后解决办法是:
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();如果我说错了什么,或者我的解决方案可以改进,请纠正我。
https://stackoverflow.com/questions/48559641
复制相似问题