首页 > 解决方案 > 如何“禁用”计算列以便应用迁移?

问题描述

我有这个迁移

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AlterColumn<bool>(
        name: "CancelledVisit",
        table: "Activities",
        type: "bit",
        nullable: false,
        defaultValue: false,
        oldClrType: typeof(bool),
        oldType: "bit",
        oldNullable: true);
}

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AlterColumn<bool>(
        name: "CancelledVisit",
        table: "Activities",
        type: "bit",
        nullable: true,
        oldClrType: typeof(bool),
        oldType: "bit");
}

WhereIsComplete是一个计算列,它CancelledVisit在计算中使用。

运行此迁移时出现错误

“IsComplete”列依赖于“CancelledVisit”列。ALTER TABLE ALTER COLUMN CancelledVisit 失败,因为一个或多个对象访问此列。

我考虑过sys.computed_columns在迁移完成后删除记录然后重新添加它,但是在尝试插入该表时出现错误:

不允许对系统目录进行临时更新。

所以我想知道我需要做什么才能简单地运行上述迁移,这实际上只是使CancelledVisit列不可为空

标签: c#sqlentity-framework-core

解决方案


我更新了我的迁移,它似乎工作

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropColumn("IsComplete", "Activities");

    migrationBuilder.AlterColumn<bool>(
        name: "CancelledVisit",
        table: "Activities",
        type: "bit",
        nullable: false,
        defaultValue: false,
        oldClrType: typeof(bool),
        oldType: "bit",
        oldNullable: true);

    migrationBuilder.AddColumn<bool>(
        name: "IsComplete",
        table: "Activities",
        computedColumnSql: comp);
}

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropColumn("IsComplete", "Activities");

    migrationBuilder.AlterColumn<bool>(
        name: "CancelledVisit",
        table: "Activities",
        type: "bit",
        nullable: true,
        oldClrType: typeof(bool),
        oldType: "bit");

    migrationBuilder.AddColumn<bool>(
        name: "IsComplete",
        table: "Activities",
        computedColumnSql: comp);
}

comp用于生成计算值的 SQL 字符串在哪里


推荐阅读