首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在XSD创建的数据集上强制执行孤儿删除

在XSD创建的数据集上强制执行孤儿删除
EN

Stack Overflow用户
提问于 2018-02-01 09:45:52
回答 1查看 110关注 0票数 0

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

  • 寄存器
  • 类型

和一对多的关系

代码语言:javascript
运行
复制
<xs:keyref name="RegisterForeingKey" refer="myXsd:TypeKey">
  <xs:selector xpath="Register"/>
  <xs:field xpath="TypeID"/>
</xs:keyref>

这意味着注册中心有一个类型,一个类型可以被多个注册中心引用。

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

有人能给我一个简单的例子来说明如何在XSD上实现它吗?

我试着把这个加到关系里

代码语言:javascript
运行
复制
<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();

但它不能清洁孤儿

EN

回答 1

Stack Overflow用户

发布于 2018-02-01 11:26:21

在阅读了这件事之后,我意识到了一些事情,我会让它们在这里帮助那些和我一样困难的人。

  • 级联在默认情况下是定义的。
  • 级联只从上到下工作,这意味着只有当您删除父程序时,它才能工作,然后它将自动删除与他关联的子类。
  • 删除一行后,需要dataset.AcceptChanges(),以便将行从数据集中分离出来。

在OP中,我试图在相反的方向上使用级联,当删除最后一个类型寄存器时,删除Type,这样它就不会成为孤儿。级联根本不是这样工作的。

因此,我的最后解决办法是:

代码语言:javascript
运行
复制
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();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48559641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档