c# - 如何清除数据库的外键约束?

标签 c# sql

我希望我的种子方法首先清除/删除数据库并删除所有旧数据,但是

context.Database.ExecuteSqlCommand("TRUNCATE TABLE [Purchases]");
context.Database.ExecuteSqlCommand("TRUNCATE TABLE [Invoices]");

给我

Cannot truncate table 'Purchases' because it is being referenced by a FOREIGN KEY constraint.

因为采购中的条目依赖于发票中的条目。如何通过种子方法清除所有数据?

编辑:这些是相关模型:

public class Invoice
{
    //Primary Key
    public int InvoiceID { get; set; }

    //Misc. info
    public DateTime CreationDate { get; set; }
    public DateTime DeadlineDate { get; set; }
    public string ReceiverName { get; set; }

    //Order details
    public virtual List<Purchase> Purchases { get; set; }

    //Auto-calculated property
    [DataType(DataType.Currency)]
    public float TotalCost { get; set; }

    //Invoice author info
    public string AuthorName { get; set; }
    public string AuthorID { get; set; }
}


public class Purchase
{
    public int PurchaseID { get; set; }

    public string ProductDescription { get; set; }

    public float SinglePrice { get; set; }

    public float Amount { get; set; }

    public float TotalPrice { get { return Amount * SinglePrice; } }
}

最佳答案

有几种解决方案。

  1. 如果您想清理整个数据库,最简单的解决方案就是重新创建整个数据库。更复杂的解决方案是删除外键,清理数据库并再次创建外键。这可以自动化。手动执行此操作不是一个好主意。最好继续进行下一个选项。

  2. 了解您的数据库结构后,您可以按顺序删除数据,这不会违反外键约束。这也可以自动化,但需要付出更多努力。然而,手动按有效顺序编写 TRUNCE 是不是很容易?

    Cannot truncate table 'Purchases' because it is being referenced by a FOREIGN KEY constraint.

    在这种情况下,首先确定哪个表引用表 Purchases,并在截断 Purchases 之前清理该表中的数据。

    此外,如果您有循环引用,则无法在不删除(或标记 WITH NOCHECK)外键的情况下删除数据。

  3. 您还可以设置级联删除,但我强烈建议您不要这样做,因为您偶尔会删除不想删除的数据。

关于c# - 如何清除数据库的外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38534804/

相关文章:

c# - Nancy 的 Windows 服务无法启动主机

c# - 如何使用 C# 连接到 MS Access 文件 (mdb)?

c# - 使用链表实现队列 - 它创建链表但在打印后停止工作

sql - INSERT IF NOT EXISTS 类型函数供我使用而不将列转换为主键?

sql - 将逗号分隔的值拆分为Oracle中的列

c# - 如何从 Rx Subscribe 回调异步函数?

c# 从 json 中获取值

sql - 将整个 SQL Server 数据库提取到 CSV 文件

iphone - 检测 iPhone 日历约会冲突的 SQL 语句

mysql - 从数据库中获取子字符串