EF Core 5 在迁移中创建了两次表

Posted

技术标签:

【中文标题】EF Core 5 在迁移中创建了两次表【英文标题】:EF Core 5 creates tables twice in migrations 【发布时间】:2021-04-22 04:43:32 【问题描述】:

我已经创建了一个项目和一个迁移,但似乎迁移在添加新迁移时并不关心以前的迁移,也就是说,迁移文件只是尝试创建相同的表两次。

我创建了两个迁移,FirstSecond。改变的是我向Post 实体添加了一个字符串属性(此处未显示)。我的预期是这样的:

migrationBuilder.AddColumn(...)

但是我得到了一个Second 迁移,其中包含来自First 迁移的所有内容,但是在创建表Post 时,它添加了列。几乎就像它甚至不关心有一个 First 迁移,因此就像它的第一次迁移一样。

第一

public partial class First : Migration

    protected override void Up(MigrationBuilder migrationBuilder)
    
        migrationBuilder.CreateTable(
            name: "AspNetRoles",
            columns: table => new
            
                Id = table.Column<string>(type: "nvarchar(450)", nullable: false),
                Name = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
                NormalizedName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
                ConcurrencyStamp = table.Column<string>(type: "nvarchar(max)", nullable: true)
            ,
            constraints: table =>
            
                table.PrimaryKey("PK_AspNetRoles", x => x.Id);
            );
    ...

第二

public partial class Second : Migration

    protected override void Up(MigrationBuilder migrationBuilder)
    
        migrationBuilder.CreateTable(
            name: "AspNetRoles",
            columns: table => new
            
                Id = table.Column<string>(type: "nvarchar(450)", nullable: false),
                Name = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
                NormalizedName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
                ConcurrencyStamp = table.Column<string>(type: "nvarchar(max)", nullable: true)
            ,
            constraints: table =>
            
                table.PrimaryKey("PK_AspNetRoles", x => x.Id);
            );
    ...

如您所见,它们是相同的,为什么会这样?

【问题讨论】:

嗯 - 在生成第二个之前,您是否应用 First migraton 到您的数据库? @marc_s 是的,我做到了,获取迁移列表将第二个显示为(待定)。但为什么需要这样做?对我来说,它可以弄清楚自上次迁移以来发生了什么变化,而不是实际数据库中的变化。 @marc_s 我发现了问题,超级奇怪,但事后看来,为什么一切都表现得如此奇怪是有道理的。 【参考方案1】:

事实证明,由于某种原因,Visual Studio for Mac 再次对我耍了花招。以下行已添加到我的 csproj 文件中。

<Compile Remove="Migrations\MainDbContextModelSnapshot.cs" />
<Compile Remove="Migrations\20210102195131_Test1.Designer.cs" />
<Compile Remove="Migrations\20210102195131_Test1.cs" />

现在,为什么它尝试再次从头开始创建所有内容,因为没有快照,这一切都说得通了。无论如何,如果这个奇怪的事情发生在其他人身上,你可能想看看你的 csproj 文件。我无法解释为什么要添加这些。

如果您看到这些行,解决方案就是删除它们,并且一切都应该按预期工作。

【讨论】:

以上是关于EF Core 5 在迁移中创建了两次表的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 迁移过程遇到EF Core tools version版本不相符的解决方案

EF Core 5.0 - 更改“定义查询”映射实体时是不是需要生成迁移?

[EF Core]数据迁移

我可以将依赖项注入迁移(使用 EF-Core 代码优先迁移)吗?

Flyway 没有正确清理数据库,执行了两次迁移文件

添加迁移EF Core时出现奇怪错误