首页 > 解决方案 > 如何使用 EF Core 将单个主键更改为复合主键

问题描述

我想删除已创建且不包含数据的 SQL 表中的单个主键 Id 列,并改为定义复合主键。

我当前的实体定义如下:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

public long IpFrom { get; set; }

public long IpTo { get; set; }
...

我想更新到这个:

[Key, Column(Order = 0)]
public long IpFrom { get; set; }

[Key, Column(Order = 1)]
public long IpTo { get; set; }
...

我已经使用 fluent api 进行了以下定义:

protected override void OnModelCreating(ModelBuilder builder)
{
   base.OnModelCreating(builder);

   builder.Entity<IPv4LocationEntity>()
     .HasKey(b => new {b.IpFrom, b.IpTo})
     .HasName("PK_TableName");
}

然后我使用 EF Tool 创建迁移文件并得到以下迁移文件。

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropPrimaryKey(
            name: "PK_TableName",
            table: "TableName");

        migrationBuilder.DropColumn(
            name: "Id",
            table: "TableName");

        migrationBuilder.AddPrimaryKey(
            name: "PK_TableName",
            table: "TableName",
            columns: new[] { "IpFrom", "IpTo" });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropPrimaryKey(
            name: "PK_TableName",
            table: "TableName");

        migrationBuilder.AddColumn<int>(
            name: "Id",
            table: "TableName",
            type: "int",
            nullable: false,
            defaultValue: 0)
            .Annotation("SqlServer:Identity", "1, 1");

        migrationBuilder.AddPrimaryKey(
            name: "PK_TableName",
            table: "TableName",
            column: "Id");
    }
}

当我想使用 EF 工具更新数据库时,我收到以下错误,即使一切对我来说似乎都是正确的:

ALTER TABLE DROP COLUMN failed because column 'Id' does not exist in table 'TableName'.

谢谢你的帮助。

标签: c#.netentity-framework.net-coreentity-framework-core

解决方案


我试过这个并且运行dotnet ef database update不应用迁移。

相反,从迁移中生成 SQL 文件并执行 SQL 查询。尝试这样做。

cd ToYourDbModelProject
dotnet ef  --startup-project ../PathToStartupProject/ migrations script previous_migration current_migration -o current_migration.sql --context Namespace.To.Your.DbContext

推荐阅读