如何使用外键约束清除数据库?

时间:2016-07-22 20:30:16

标签: c# sql

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

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

给了我

  

无法截断表格'购买'因为它被a引用   FOREIGN KEY约束。

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

编辑:这些是相关模型:

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; } }
}

4 个答案:

答案 0 :(得分:1)

有几种解决方案。

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

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

      

    无法截断表格&#39;购买&#39;因为它是由FOREIGN KEY约束引用的。

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

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

  3. 你也可以设置级联删除,但我强烈反对它,因为你偶尔可以删除你不想删除的数据。

答案 1 :(得分:1)

由于在更新数据库后调用种子方法,我不认为您的方法可行。我过去所做的就是执行:

Update-Database -TargetMigration 0

这会将数据库重置为第一次迁移。然后执行:

Update-Database

答案 2 :(得分:0)

您需要按照外键约束的顺序清除表。如果您的采购表由发票中的外键约束引用,则需要先截断发票。

答案 3 :(得分:0)

如果您只是想清除数据以重新播种,则agriffin是正确的,只需使用-Target-Migration:0重置EF。

如果您尝试截断生产数据,则需要先删除外键约束,然后再重新添加它们。它没有任何办法。

但是my other answer here中的脚本会快速生成您需要在截断之前和之后添加的ALTER TABLE SQL。我建议将其作为存储过程的一部分来完成:

ALTER TABLE [dbo].[Purchases] DROP CONSTRAINT....

TRUNCATE TABLE [Purchases];

ALTER TABLE [dbo].[Purchases] ADD CONSTRAINT....