我正在使用 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");
}
我在这里检查了许多主题,但没有一个包含“复合主外键”的解决方案。
我找到了这篇文章关于手动更改生成的迁移代码。但我不确定它是否适用于复合主键和外键。或者,如果这是解决此问题的正确方法。
任何建议将不胜感激。
以防万一有人正在寻找这个问题的答案,这就是我解决问题的方法。
我编辑了生成的迁移代码,如下,先手动删除
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
方法添加了相同的代码。