我希望我的种子方法首先清除/删除数据库并删除所有旧数据,但是
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; } }
}
答案 0 :(得分:1)
有几种解决方案。
如果要清理整个数据库,最简单的解决方案就是重新创建整个数据库。更复杂的解决方案是删除外键,清理数据库并创建foreight键agan。这可以自动化。手动执行此操作并不是一个好主意。进入下一个选项要好得多。
了解您的数据库结构,您只需删除订单中的数据,这不会违反外键约束。这也可以自动化,但需要付出更多努力。但是,手动编写有效顺序的TRUNCE
非常容易。
无法截断表格&#39;购买&#39;因为它是由FOREIGN KEY约束引用的。
在这种情况下,首先确定引用表Purchases
的表,并在截断Purchases
之前清除该表中的数据。
如果您有循环引用,也无法在不删除(或标记WITH NOCHECK
)外键的情况下删除数据。
你也可以设置级联删除,但我强烈反对它,因为你偶尔可以删除你不想删除的数据。
答案 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....