【问题标题】:Enforce orphan deletion on a dataset created by XSD对 XSD 创建的数据集强制执行孤立删除
【发布时间】:2018-02-01 09:45:52
【问题描述】:

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

  • 注册
  • 类型

还有一对多的关系

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

这意味着Registers只有一个Type,一个Type可以被多个Register引用。

当我删除一个寄存器时,如果它是孤立的,我想清理关联的类型(清理没有关联的类型)。 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();

但它不会清理孤儿

【问题讨论】:

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


    【解决方案1】:

    读完这件事后,我意识到了一些事情,我会在这里帮助其他和我一样困难的人。

    • 默认定义级联
    • Cascade 只对 Top to Bottom 有效,也就是说只有删除父节点才有效,然后它会自动删除与他关联的子节点
    • 删除一行后需​​要dataset.AcceptChanges(),以便将行从数据集中分离出来

    在 OP 中,我试图以相反的方向使用 Cascade,当删除一个类型的最后一个寄存器时,删除该类型,使其不会保持孤立状态。 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();
    

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

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 2023-04-10
      • 1970-01-01
      • 2017-06-04
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多