[在C#中清除父表时,InvalidConstraintException

问题描述 投票:0回答:1

也许我只是看不到树木茂密的森林,但目前我面临着以下使我感到困惑的情况:

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

LinesOrders表之间通过订单ID连接它们之间存在关系。该关系被配置为既是关系又是外键约束,并且更新规则和删除规则均设置为“级联”。

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

我当然可以通过在清除Lines表之前先清除Orders表来解决此问题,但是我仍然对为什么在这种情况下不应用级联规则感到困惑。

c# foreign-keys dataset relationship cascade
1个回答
0
投票

[不确定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}");

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

Console.WriteLine($"Total Number of Lines after delete is {dataset.Lines.Count}");
© www.soinside.com 2019 - 2024. All rights reserved.