EF Core 5 迁移 - 更新复合主键和外键

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

我正在使用 EF Core 代码优先迁移。我有两个表(模型),

TableA
有4列设置为复合主键,
TableB
有相同的4列设置为
TableA
的主键和外键。

四列之一的类型为

int
,我需要将其更改为
long
。我在两个模型中将类型更改为
long
并添加了新的迁移。但是,在尝试更新数据库以应用迁移时出现以下错误:

对象“PK_TableA”依赖于列“Number”。

对象“FK_TableB_TableA_Column1_Column2_Column3_Column4”依赖于列“Number”。

ALTER TABLE ALTER COLUMN 编号失败,因为一个或多个对象访问此列。

上述错误中的第

Number
列(第 3 列)的类型为
int

生成的迁移如下:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AlterColumn<long>(
        name: "Number",
        table: "TableA",
        type: "bigint",
        nullable: false,
        oldClrType: typeof(int),
        oldType: "int");

    migrationBuilder.AlterColumn<long>(
        name: "Number",
        table: "TableB",
        type: "bigint",
        nullable: false,
        oldClrType: typeof(int),
        oldType: "int");
}

我在这里检查了许多主题,但没有一个包含“复合主外键”的解决方案。

我找到了这篇文章关于手动更改生成的迁移代码。但我不确定它是否适用于复合主键和外键。或者,如果这是解决此问题的正确方法。

任何建议将不胜感激。

entity-framework-core
1个回答
1
投票

以防万一有人正在寻找这个问题的答案,这就是我解决问题的方法。

我编辑了生成的迁移代码,如下,先手动删除

TableB
中的外键,然后手动删除
TableA
TableB
中的两个复合主键,然后将列类型更改为
bigint
后添加它们(根据生成的迁移代码):

protected override void Up(MigrationBuilder migrationBuilder)
{
  migrationBuilder.DropForeignKey(
    name: "FK_TableB",
    table: "TableB");

  migrationBuilder.DropPrimaryKey(
    name: "PK_TableA",
    table: "TableA");

  migrationBuilder.DropPrimaryKey(
    name: "PK_TableB",
    table: "TableB");

  migrationBuilder.AlterColumn<long>(
    name: "Number",
    table: "TableA",
    type: "bigint",
    nullable: false,
    oldClrType: typeof(int),
    oldType: "int");

  migrationBuilder.AlterColumn<long>(
    name: "Number",
    table: "TableB",
    type: "bigint",
    nullable: false,
    oldClrType: typeof(int),
    oldType: "int");

  migrationBuilder.AddPrimaryKey(
    name: "PK_TableA",
    table: "TableA",
    columns: new[] { "Column1", "Column2", "Column3", "Column4" });

  migrationBuilder.AddPrimaryKey(
    name: "PK_TableB",
    table: "TableB",
    columns: new[] { "Column1", "Column2", "Column3", "Column4" });

  migrationBuilder.AddForeignKey(
    name: "FK_TableB",
    table: "TableB",
    columns: new[] { "Column1", "Column2", "Column3", "Column4" },
    principalTable: "TableA",
    principalColumns: new[] { "Column1", "Column2", "Column3", "Column4" },
    onDelete: ReferentialAction.Cascade);
}

Down
方法添加了相同的代码。

© www.soinside.com 2019 - 2024. All rights reserved.