C#如何清除所有外键引用,以便将删除的主键记录保存到数据库中?

Posted

技术标签:

【中文标题】C#如何清除所有外键引用,以便将删除的主键记录保存到数据库中?【英文标题】:C# How can I clear all foreign key references in order to save the deletion of the primary key record to the database? 【发布时间】:2014-08-15 20:16:43 【问题描述】:

当我对主键记录执行删除时,它会删除外键记录并保存更改,但是当它去删除主键记录时,它不会让我将主键记录的删除保存到数据库。相反,它给出了以下错误:

错误:无法删除主键值,因为对该键的引用仍然存在。 [ >外键约束名 = FK_PERSONID ]

根据我在网上看到的情况,我应该能够通过代码或通过数据集设计器视图禁用 EnforceConstraints。通过代码失败后,我尝试在数据集设计器视图中将 EnforceConstraints 更改为 False。它仍然给出同样的错误。我尝试编辑外键约束来执行级联删除,但它仍然给出相同的错误。 尝试仅使用没有代码的 Cascade Delete 来执行此操作得到了相同的错误。 这是我执行删除的部分。

    bizDocStartupDBDataSet1.EnforceConstraints = false;

    BizDocStartupDBDataSet1.EmployeeTitlesRow oldEmployeeTitlesRow;
    oldEmployeeTitlesRow = bizDocStartupDBDataSet1.EmployeeTitles.FindByPERSONIDCOMPANYID(currentPersonID,1);
    oldEmployeeTitlesRow.Delete();
    this.employeeTitlesTableAdapter.Update(this.bizDocStartupDBDataSet1.EmployeeTitles);
    this.Validate();
    this.employeeTitlesBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.bizDocStartupDBDataSet1);

    this.peopleProfilesBindingSource.RemoveCurrent();
    SaveData();
    bindingNavigatorDeleteItem.Enabled = true;
    bizDocStartupDBDataSet1.EnforceConstraints = true;

SaveData 函数只是标准的重新填充表的保存,但是对数据表的更改无法保存到数据库,因为仍然有外键的引用。

在删除带有外记录的键后,如何清除所有对外键的引用,以便将删除的主键记录保存到数据库中?

【问题讨论】:

【参考方案1】:

外键用于防止记录成为孤立记录,因此仅当您一开始就不需要它时,摆脱外键才是一种解决方案。话虽如此,您必须级联删除,并从包含外键的表中的记录开始,首先删除该记录,然后删除具有主键的记录。您可能必须按照自己的方式制作两个数据适配器,但理想情况下,您应该使用存储的过程来完成这一切。

【讨论】:

【参考方案2】:

如果您有绑定表,请确保您不会从主表中删除记录,除非您不再使用它们。

如果有另一个表包含您尝试删除它的记录的外键,那么您将遇到这个问题。

删除那些是您要删除的记录的外键的记录,然后最后删除您实际要删除的记录。

所以我想你应该小心你试图删除的内容。希望对您有所帮助!

最后一个问题:您必须删除所有外来记录。

【讨论】:

【参考方案3】:

EnforceConstraints 是 C# DataSet 对象的属性。修改此值不会影响数据库的结构或行为。

级联删除是解决问题的一种方法——触发器是另一种方法。但作为一般规则,我不认为您应该依赖数据库中的自动删除。我认为最好使用存储过程来管理此删除,方法是先找到所有依赖项并删除它们,然后再从主键表中删除。这样,您就可以确切地知道数据库中发生了什么。

我很惊讶您在使用级联删除修改 FK 后仍然收到 FK 错误。也许将确切的错误和您的更新发布到表格中,我们可以更好地掌握正在发生的事情?

【讨论】:

以上是关于C#如何清除所有外键引用,以便将删除的主键记录保存到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA hibernate中删除表遇到主键被外键引用,违反完整约束条件,不能删除的问题 2张表,一张主表user,有

Django模型基于外键自动递增主键

SQL的主键和外键的作用

sqlserver外键关系有啥用?

关于 主键和外键

如何在数据库C#中查找表的主键