也许我只是看不到树木茂密的森林,但目前我面临着以下使我感到困惑的情况:
我有一个类型化的数据集(未连接到数据库),其中包含两个表:Orders
和Lines
。 Orders
表中的每个条目代表一个订单,令人惊讶的是,Lines
表中的每个条目代表一个订单的一行。每个订单可以有多行。
Lines
和Orders
表之间通过订单ID连接它们之间存在关系。该关系被配置为既是关系又是外键约束,并且更新规则和删除规则均设置为“级联”。
我曾希望通过Orders
清除set.Orders.Rows.Clear();
表也会从Lines
表中删除相应的条目-但是我收到InvalidConstraintException
说我不能这样做,因为有Lines
表中的条目与Orders
表中的条目相关联。
我当然可以通过在清除Lines
表之前先清除Orders
表来解决此问题,但是我仍然对为什么在这种情况下不应用级联规则感到困惑。
[不确定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}");