在 C# 中清除父 table 时出现 InvalidConstraintException
InvalidConstraintException when clearing parent table in C#
可能是我只见树木不见森林,但目前我面临着以下情况让我很困惑:
我有一个类型化数据集(未连接到数据库),其中包含两个 table:Orders
和 Lines
。 Orders
table 中的每个条目代表一个订单,令人惊讶的是,Lines
table 中的每个条目代表一个订单的一行。每个订单可以有多行。
Lines
和 Orders
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
可能是我只见树木不见森林,但目前我面临着以下情况让我很困惑:
我有一个类型化数据集(未连接到数据库),其中包含两个 table:Orders
和 Lines
。 Orders
table 中的每个条目代表一个订单,令人惊讶的是,Lines
table 中的每个条目代表一个订单的一行。每个订单可以有多行。
Lines
和 Orders
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