在 C# 中清除父 table 时出现 InvalidConstraintException

InvalidConstraintException when clearing parent table in C#

可能是我只见树木不见森林,但目前我面临着以下情况让我很困惑:

我有一个类型化数据集(未连接到数据库),其中包含两个 table:OrdersLinesOrders table 中的每个条目代表一个订单,令人惊讶的是,Lines table 中的每个条目代表一个订单的一行。每个订单可以有多行。

LinesOrders table 之间存在关系,通过订单 ID 连接它们。该关系被配置为关系和外键约束,更新规则和删除规则都设置为 "Cascade".

我原以为通过 set.Orders.Rows.Clear(); 清除 Orders table 也会从 Lines table 中删除相应的条目 - 但是我我收到 InvalidConstraintException 说我不能这样做,因为 Lines table 中的条目与 Orders table 中的条目关联。

我当然可以通过在清除 Orders table 之前先清除 Lines table 来解决这个问题,但我仍然不明白为什么在这种情况下不应用级联规则。

不确定为什么 Clear() 会显示它对这些约束所做的错误,但是当您尝试 Remove 一行时,预期的功能就会发生。考虑到这一点,像这样的扩展方法可以解决问题:

public static void RemoveAll(this DataTable table)
{
    for (int index = table.Rows.Count - 1; index >= 0; index--)
    {
        table.Rows.RemoveAt(index);
    }
}

用例:

Transactions dataset = new Transactions();
dataset.Orders.AddOrderRow("1");
dataset.Orders.AddOrderRow("2");

dataset.Lines.AddLineRow(dataset.Orders[0], 1);
dataset.Lines.AddLineRow(dataset.Orders[0], 2);
dataset.Lines.AddLineRow(dataset.Orders[0], 3);

dataset.Lines.AddLineRow(dataset.Orders[1], 1);
dataset.Lines.AddLineRow(dataset.Orders[1], 2);
dataset.Lines.AddLineRow(dataset.Orders[1], 3);

Console.WriteLine($"Total Number of Lines before delete is {dataset.Lines.Count}"); // Prints 6

//dataset.Orders.Rows.Clear();
dataset.Orders.RemoveAll();

Console.WriteLine($"Total Number of Lines after delete is {dataset.Lines.Count}"); // Prints 0