c#ef核心RemoveRange违反约束

时间:2020-08-20 09:45:16

标签: c# sql sql-server entity-framework

嗨,我有一个包含许多表和关系的复杂数据库 我们要做的是将所有表从一个数据库复制到另一个表,但仅从一个表(销售订单)开始并按照关系向下进行行。 因此,我避免使用.include,而是使用IQueryable查询(每个表一个) 插入没有问题

问题是当我想从所有表中删除所有行时,我遇到了约束违例 我使用.RemoveRange(tableRowsqueryable)

我已经尝试禁用所有FK检查,但是当我重新启用时会出现相同的错误

错误

SqlException:DELETE语句与REFERENCE冲突 约束“ FK_InvParty_Stop_InvParty”。发生冲突 数据库“ UDM”,表“ dbo.InvParty_Stop”,列“ InvPartyID”。

InvPartyID列也在InvParty_Stop表的PK中

我尝试调试以检查是否缺少某些东西,但是我没有发现任何错误! 另一种解决方案是使用存储过程来完成这项工作

2 个答案:

答案 0 :(得分:0)

删除或更新具有外键关系的项目时,您需要指定对相关记录的处理。这些设置在数据库级别执行。您可以检查语法参考on MSDN。 您有以下选择:

[删除{无操作|级联| SET NULL |设置默认值}]

  • 不采取行动-发生错误时的默认行为
  • CASCADE-删除相关记录。当所有相关记录被隐式删除时。
  • SET NULL和SET DEFAULT-使用NULL或默认值更新参考值

您可以在下面的help article中查看详细说明,然后选择适合您情况的最佳方法。

答案 1 :(得分:0)

好的,如果您有一个与另一个表相关联的表。如果您尝试删除关联的那一行,则会发生这种情况。

示例:

| Table Person  | Table Car   |
| ------------  | ----------- |
| ID            | ID          |
| Name          | PersonFK_ID |

正如您在上面看到的,表Person与表车关联。让我们看一些数据。


| Table Person      |
|  ---------------  |
| ID    |  Name     |
| 1     | Mark      |
| 2     | Caio      |
| 3     | David     |
|  ---------------  |
| Table Car         |
| ID  | PersonFK_ID |
| 10  | 2           |
| 11  | 1           |

现在,如果您尝试删除ID为1的人,这将通知ID为11 PersonFK_ID 1的汽车中的数据冲突。现在,如果您尝试从Table car中删除任何行,则不会有冲突,因为该table car与其他表没有关联。然后,要删除ID为1的人,请先删除ID为11的汽车。

您可以通过两种简单的方法来解决此问题:

1-删除关联的数据;

2-将外部列转换为简单列。

OBS:the column FK_InvParty_Stop_InvParty looks like InvPartyID from InvParty_Stop

您可以根据需要搜索其他方式。