【发布时间】:2019-08-18 04:41:37
【问题描述】:
我想将 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 core 2.1 和选项DropForeignKey 和DropIndex
提到根据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);
}
}
有人知道如何调整 .NET Core 2.2 中的迁移类以使其正常工作吗?
谢谢
【问题讨论】:
-
DropForeignKey/DropIndex在 2.2 中可用。只是链接(文档)是针对 2.1 的,没有针对 2.2 的文档 -
很有趣 - 但它与文章中提到的命名空间不同吗?因为它在
Microsoft.EntityFrameworkCore.Migrations和 Ctrl 下找不到。 Dot (Visual Studio) 也没有在不同的命名空间下找到它。 -
抱歉,链接的问题是针对 EF6 的。对于 EF Core,所有这些都是
MigrationBuilder类的实例方法(如生成的迁移中的CreateTable或AlterColumn等)。看看migrationBuilder.DropForeignKey(name: "...", table: "...")等。 -
@IvanStoev,它实际上像你说的那样工作 - 请参阅下面的答案。非常感谢!
标签: c# asp.net-core-mvc entity-framework-core-2.2