我正在开发一个使用 Entity-Framework 和代码优先的现有项目。我需要在迁移运行之前运行一些 SQL,但我收到有关外键约束的错误,因此我需要从表中删除现有数据。我可以在不使用 DbMigration.DropTable() 删除表的情况下做到这一点吗?
我想我找到了:
Sql("Truncate table dbo.MyTable");
谢谢你的帮助。
您不能截断使用外键约束引用的表。
您唯一的选择是使用
DELETE FROM
从未被任何其他表引用的表开始手动截断数据。相当于 EF 的东西就像
db.TableToTruncate.RemoveRange(db.TableToTruncate);
我有一个类似的问题,但我通过手动将 sql 添加到 MigrationBuilder 解决了它。以防万一这可以节省其他人几分钟的搜索时间......
migrationBuilder.Operations.Add(new SqlOperation
{
Sql = "delete from WhateverTable"
});
在某些情况下,在生产环境中您没有填充脚本,而您需要表的内容。在这种情况下,您可以使用 DbMigration.DropForeignKey 和 DbMigration.AddForeignKey 函数或创建一个 MyTableCopy 表,运行您的 SQL 并将 MyTable 的内容插入到您的新表中。之后,在新迁移中,您可以删除原始表并重命名新表。
我在 .net core EF 中也有类似的问题。所以我添加了下面的代码。
await dbContext.Database.ExecuteSqlRawAsync(
"Truncate only public.\"TableName\" RESTART IDENTITY CASCADE");
我有一个类似的问题,但我通过像这样向 MigrationBuilder 添加 SQL 命令来解决它:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Operations.Add(new SqlOperation
{
Sql = "TRUNCATE TABLE your_table_name",
});
.
.
.
.
}