c# - 将模型.net Core 2.2 中的关键属性的数据类型从 int 更改为 long

标签 c# asp.net-core-mvc entity-framework-core-2.2

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

更改模型中的数据类型并运行 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 中执行此操作的有用信息,我找到的最接近的信息是 this question但它谈到了 .net 核心 2.1 和选项 DropForeignKeyDropIndex 提到根据this article,.net core 2.2 似乎不再可用.

这是迁移类:

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 中的迁移类以使其工作吗?

谢谢

最佳答案

感谢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);
    }
}

再次感谢,伊万!!

关于c# - 将模型.net Core 2.2 中的关键属性的数据类型从 int 更改为 long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57538018/

相关文章:

C# 随机算法直到满足条件

c# - ASP.NET 核心 (MVC) : Can't get to the Login HttpPost action in controller

c# - 让所有 parent 共有的 child

c# - 在C#中的字典的第N个位置存储值

c# - 是否可以从 autofac 注册中排除构造函数?

javascript - 禁用按钮 .Net Core MVC View

asp.net-core-mvc - ASP.NET Core 模型绑定(bind)未知长度的集合

c# - Entity Framework 中的 ANY 和 ALL 在本地进行评估

c# - EF Core 中的断开连接的实体

c# - 防止添加到公共(public)词典