c# - 在模型 .net Core 2.2 中将数据类型从 int 更改为 long 的关键属性
问题描述
我想将 ASP.Net core 2.2 中模型主键的数据类型从 int 更改为 long,因为它即将超出 int 范围。该应用程序是代码优先完成的,并使用 SQL 服务器作为数据库。
更改模型中的数据类型并运行 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 和选项DropForeignKey
,并DropIndex
提到那里似乎不再可用.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);
}
}
有人知道如何调整 .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);
}
}
再次感谢,伊万!
推荐阅读
- java - 当我按下按钮时,在 Minecraft 1.12.2 中制作物品会做一些事情
- css - 将纵向切换为横向时,React 应用程序的 CSS 布局会中断
- python - 使用openCV转换为二进制时,从模型创建的图像中的分割区域消失了
- c# - 未发布 ASP.NET MVC .NET(非核心)表单字段
- python - 如何检查基于函数的视图是从另一个重定向函数还是直接从 url 调用的?
- javascript - 一个内联可折叠,其结束 X 坐标取决于其起始 X 坐标
- matlab - 从蓝色到白色的轮廓颜色图,带有渐变
- c++ - 在 C++ 中实现随机访问迭代器有什么问题?
- git - 如何在 git 提交损坏的网站中找到特定文件的代码?
- java - Java跨多个文件的多类继承