EF 迁移:截断表

问题描述 投票:0回答:6

我正在开发一个使用 Entity-Framework 和代码优先的现有项目。我需要在迁移运行之前运行一些 SQL,但我收到有关外键约束的错误,因此我需要从表中删除现有数据。我可以在不使用 DbMigration.DropTable() 删除表的情况下做到这一点吗?

c# entity-framework entity-framework-migrations
6个回答
3
投票

我想我找到了:

Sql("Truncate table dbo.MyTable"); 

谢谢你的帮助。


1
投票

您不能截断使用外键约束引用的表。

您唯一的选择是使用

DELETE FROM
从未被任何其他表引用的表开始手动截断数据。相当于 EF 的东西就像

db.TableToTruncate.RemoveRange(db.TableToTruncate);

1
投票

我有一个类似的问题,但我通过手动将 sql 添加到 MigrationBuilder 解决了它。以防万一这可以节省其他人几分钟的搜索时间......

migrationBuilder.Operations.Add(new SqlOperation
{
    Sql = "delete from WhateverTable"
});

0
投票

在某些情况下,在生产环境中您没有填充脚本,而您需要表的内容。在这种情况下,您可以使用 DbMigration.DropForeignKey 和 DbMigration.AddForeignKey 函数或创建一个 MyTableCopy 表,运行您的 SQL 并将 MyTable 的内容插入到您的新表中。之后,在新迁移中,您可以删除原始表并重命名新表。


0
投票

我在 .net core EF 中也有类似的问题。所以我添加了下面的代码。

await dbContext.Database.ExecuteSqlRawAsync(
            "Truncate only public.\"TableName\" RESTART IDENTITY CASCADE");

0
投票

我有一个类似的问题,但我通过像这样向 MigrationBuilder 添加 SQL 命令来解决它:

protected override void Up(MigrationBuilder migrationBuilder)
{
     migrationBuilder.Operations.Add(new SqlOperation
     {
          Sql = "TRUNCATE TABLE your_table_name",
     });
     .
     .
     .
     .
}
© www.soinside.com 2019 - 2024. All rights reserved.