【问题标题】:c# ef core RemoveRange contraint violationc# ef core RemoveRange 约束冲突
【发布时间】:2020-08-20 09:45:16
【问题描述】:

您好,我有一个包含许多表和关系的复杂数据库 我们想要做的是将所有表从数据库复制到另一个,但只从一个表(salesorder)开始获取行并遵循关系。 所以我避免使用 .Include,并使用 IQueryable 查询(每个表一个) 插入没问题

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

我已经尝试禁用所有 FK 检查,但是当我重新启用时,我得到了同样的错误

错误

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

InvPartyID 列也在 InvParty_Stop 表的 PK 中

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

【问题讨论】:

  • 必须先删除关联表的行或者解除关联
  • 有没有办法查看是什么产生了这个冲突?我的意思是行/ID或更具体的东西?

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


【解决方案1】:

好的,如果您将一个表关联到另一个表。如果您尝试删除关联的那一行,就会发生这种情况。

例子:

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

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


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

现在,如果您尝试删除 ID 为 1 的人员,这将通知与 ID 为 11PersonFK_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

如果你愿意,你可以搜索其他方式。

【讨论】:

    【解决方案2】:

    当具有外键关系的项目被删除或更新时,您需要指定您需要对相关记录执行什么操作。这些设置在 DB 级别执行。您可以查看语法参考on MSDN。 您有以下选择:

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

    • NO ACTION - 出现错误时的默认行为
    • CASCADE - 删除相关记录。当所有相关记录都被隐式删除时。
    • SET NULL 和 SET DEFAULT - 使用 NULL 或默认值更新参考值

    您可以查看以下help article 中的详细说明,并根据您的场景选择最佳方法。

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2019-02-16
      • 2019-05-09
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2011-01-31
      相关资源
      最近更新 更多