Entity Framework Core 2.1,使用代码优先迁移重命名表,而无需删除和创建新表

时间:2018-07-26 08:36:52

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

我正在将netcoreapp 2.1与EF Core 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的标志。我想念的exe文件?

2 个答案:

答案 0 :(得分:2)

签出https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.migrations.migrationbuilder.renametable?view=efcore-2.1

您可以仅调用migrationBuilder.RenameTable(“ Old”,null,“ New”);

答案 1 :(得分:0)

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

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