在 model .net Core 2.2 中将数据类型从 int 更改为 long of key 属性

Change data type from int to long of key property in model .net Core 2.2

我想将 ASP.Net 核心 2.2 中模型主键的数据类型从 int 更改为 long,因为它即将 运行 超出 int 范围。该应用程序以代码优先的方式完成,并使用 SQL 服务器作为数据库。

更改模型中的数据类型有效,运行ning Add-Migration 也有效,但 Update-Database 失败并出现错误:

System.Data.SqlClient.SqlException (0x80131904): The index 'IX_tblMTransactions_OriginalTransactionId' is dependent on column 'OriginalTransactionId'.
The object 'FK_tblMTransactions_tblMTransactions_OriginalTransactionId' is dependent on column 'OriginalTransactionId'.

所以我读到了它,似乎需要对迁移进行一些调整,比如在列更改之前删除外键和索引,然后再将它们恢复。不幸的是,我找不到任何关于在 .net core 2.2 中执行此操作的有用信息,我找到的最接近的信息是 但它讨论了 .net core 2.1 以及选项 DropForeignKeyDropIndex 提到根据 this article.

,.net core 2.2 似乎不再可用

这里是迁移 class:

public partial class _20190817_1746 : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterColumn<long>(
            name: "OriginalTransactionId",
            table: "tblMTransactions",
            nullable: true,
            oldClrType: typeof(int),
            oldNullable: true);

        migrationBuilder.AlterColumn<long>(
            name: "Id",
            table: "tblMTransactions",
            nullable: false,
            oldClrType: typeof(int))
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
            .OldAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterColumn<int>(
            name: "OriginalTransactionId",
            table: "tblMTransactions",
            nullable: true,
            oldClrType: typeof(long),
            oldNullable: true);

        migrationBuilder.AlterColumn<int>(
            name: "Id",
            table: "tblMTransactions",
            nullable: false,
            oldClrType: typeof(long))
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
            .OldAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
    }
}

这是 table 的列、键和索引的屏幕截图:

有谁知道如何在 .NET Core 2.2 中调整迁移 class 以使其正常工作?

谢谢

感谢 Ivan Stoev 我能够找到解决方案。我必须像这样手动添加索引和键的删除和创建:

public partial class _20190817_2317 : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_tblMTransactions_tblMTransactions_OriginalTransactionId",
            table: "tblMTransactions");

        migrationBuilder.DropIndex(
            name: "IX_tblMTransactions_OriginalTransactionId",
            table: "tblMTransactions");

        migrationBuilder.DropPrimaryKey(
            name: "PK_tblMTransactions",
            table: "tblMTransactions");

        migrationBuilder.AlterColumn<long>(
            name: "OriginalTransactionId",
            table: "tblMTransactions",
            nullable: true,
            oldClrType: typeof(int),
            oldNullable: true);

        migrationBuilder.AlterColumn<long>(
            name: "Id",
            table: "tblMTransactions",
            nullable: false,
            oldClrType: typeof(int))
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
            .OldAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

        migrationBuilder.AddPrimaryKey(
            name: "PK_tblMTransactions",
            table: "tblMTransactions",
            column: "Id");

        migrationBuilder.CreateIndex(
            name: "IX_tblMTransactions_OriginalTransactionId",
            table: "tblMTransactions",
            column: "OriginalTransactionId");

        migrationBuilder.AddForeignKey(
            name: "FK_tblMTransactions_tblMTransactions_OriginalTransactionId",
            table: "tblMTransactions",
            column: "OriginalTransactionId",
            principalTable: "tblMTransactions",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterColumn<int>(
            name: "OriginalTransactionId",
            table: "tblMTransactions",
            nullable: true,
            oldClrType: typeof(long),
            oldNullable: true);

        migrationBuilder.AlterColumn<int>(
            name: "Id",
            table: "tblMTransactions",
            nullable: false,
            oldClrType: typeof(long))
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
            .OldAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
    }
}

再次感谢伊万!!