【问题标题】:Entity Framework Core 2.1, rename table using code-first migrations without dropping and creating new tableEntity Framework Core 2.1,使用代码优先迁移重命名表而不删除和创建新表
【发布时间】:2018-07-26 08:36:52
【问题描述】:

我正在使用带有 EF Core 2.1 的 netcoreapp 2.1 并使用数据迁移更新我的数据库,并且在重命名表时遇到了问题。我的主要问题是一个表(以及以后可能的列)可能会用数据多次重命名,我希望能够在保持这些数据完整的同时重命名它们,但从我读过的内容来看,这些迁移似乎只关心保持架构是最新的。

此问题与Change or rename a column name without losing data with Entity Framework Core 2.0 类似,但由于我的过程是自动化的,因此我需要能够在命令行中通过 dotnet.exe 使用迁移本身来执行此操作。

为此,我将下面的参数传递给 dotnet.exe,构建解决方案,从 DLL 获取数据库上下文,然后使用下面的行运行迁移。

ef migrations add "someMigrationName"

...更新数据库

var migrator = dbContext.Database.GetService<IMigrator>();
migrator.Migrate();

例如,如果名为“Courases”的表开始收集数据,我需要能够将其重命名为“Courses”而不影响数据,但目前以下是迁移中生成的 Up 函数。

protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Courases");

        migrationBuilder.CreateTable(
            name: "Courses",
            columns: table => new
            {
                Id = table.Column<Guid>(nullable: false),
                ConcurrencyCheck = table.Column<byte[]>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Courses", x => x.Id);
            });

    }

根据我的阅读,似乎没有办法通过重命名而不是删除和重新创建表来生成迁移,但这似乎很疯狂,有没有办法做到这一点/是否有我可以传递给 dotnet 的标志。我错过了什么?

【问题讨论】:

  • 如果您只想重命名,只需使用[Table] 数据注释或ToTable fluent API。如果您确实想重命名实体类,请参阅Rename a foreign key in Entity Framework Core without dropping data(标题具有误导性)。
  • Issue #5826 将在大多数情况下解决此问题。
  • @IvanStoev 谢谢,现在这可能是一个很好的解决方法,所有的编辑和代码生成都是通过 Roslyn Api 完成的,所以我认为需要坚持解决 bricelam 发布的问题。谢谢大家
  • @JimG。 EF 核心与 EF 5 完全不同,这也是一个完全不同的问题

标签: c# .net-core entity-framework-migrations ef-core-2.1


【解决方案1】:

【讨论】:

  • 对于那些还没有检查@Ivan Stoev 评论的人,请这样做。这是最好的答案,特别是如果您有其他关系、约束和索引。
【解决方案2】:

我在 EF Core 5.0 中使用 dotnet ef migrations add 命令遇到了同样的问题。它想删除表并重新创建它们,这意味着我会丢失所有数据。

我试图添加一个新表并重命名其中一些。它显然不喜欢那样,我将它分成 2 次迁移。首先我添加了新表,然后我重命名了其他表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2020-09-09
    • 2016-04-12
    相关资源
    最近更新 更多