【问题标题】:Update-Database failed: "The index 'IX_Task_UserId' is dependent on column 'UserId'"更新数据库失败:“索引 'IX_Task_UserId' 依赖于列 'UserId'”
【发布时间】:2017-05-22 08:25:41
【问题描述】:

在 3 个模型的 2 个属性中添加 [required] 注释并运行 add-migration 后,运行 update-database 时出现以下错误。

ALTER TABLE ALTER COLUMN UserId failed because one or more objects access this column. The index 'IX_Task_UserId' is dependent on column 'UserId'.

我的 up() 迁移如下所示:

protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_TaskList_AspNetUsers_UserId",
            table: "TaskList");

        migrationBuilder.DropForeignKey(
            name: "FK_Template_AspNetUsers_UserId",
            table: "Template");

        migrationBuilder.DropForeignKey(
            name: "FK_Task_AspNetUsers_UserId",
            table: "Task");

        migrationBuilder.AlterColumn<string>(
            name: "UserId",
            table: "Task",
            nullable: false);

        migrationBuilder.AlterColumn<string>(
            name: "TaskName",
            table: "Task",
            nullable: false);

        migrationBuilder.AlterColumn<string>(
            name: "UserId",
            table: "Template",
            nullable: false);

        migrationBuilder.AlterColumn<string>(
            name: "TemplateName",
            table: "Template",
            nullable: false);

        migrationBuilder.AlterColumn<string>(
            name: "UserId",
            table: "TaskList",
            nullable: false);

        migrationBuilder.AlterColumn<string>(
            name: "ListName",
            table: "TaskList",
            nullable: false);

        migrationBuilder.AddForeignKey(
            name: "FK_TaskList_AspNetUsers_UserId",
            table: "TaskList",
            column: "UserId",
            principalTable: "AspNetUsers",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);

        migrationBuilder.AddForeignKey(
            name: "FK_Template_AspNetUsers_UserId",
            table: "Template",
            column: "UserId",
            principalTable: "AspNetUsers",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);

        migrationBuilder.AddForeignKey(
            name: "FK_Task_AspNetUsers_UserId",
            table: "Task",
            column: "UserId",
            principalTable: "AspNetUsers",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    }

我不确定错误指的是什么索引,我也不完全理解为什么要删除外键(同样,我所做的只是使一些属性不可为空)。感谢您的帮助。

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework asp.net-core entity-framework-core


    【解决方案1】:

    我所做的只是让一些属性不可为空

    好吧,通常将不可为空(必需)的表列转换为可空(可选)是没有问题的,但反之亦然,因此最好提前仔细考虑。

    这里的“小”问题是少数几个属性中的大多数都是外键,这使转换更加复杂。 EF Core 自动生成的迁移尝试通过在更改列之前删除 FK 约束并在之后重新创建它们来正确处理该问题。不幸的是,FK 约束通常具有关联的索引(如果您发现创建例如“FK_Task_AspNetUsers_UserId”的迁移,您应该看到它还创建了一个索引“IX_Task_UserId”),并且他们也忘记删除并重新创建索引,这导致你得到的异常(它来自数据库)。

    因此您需要手动修复生成的迁移(您也可以考虑将错误报告发布到 EF Core 存储库)。

    为此,请在第一个 AlterColumn 调用之前插入以下内容:

    migrationBuilder.DropIndex(
        name: "IX_Task_UserId",
        table: "Task");
    

    以及最后一次AlterColumn 调用之后的以下内容:

    migrationBuilder.CreateIndex(
        name: "IX_Task_UserId",
        table: "Task",
        column: "UserId");
    

    问题应该解决了。

    请注意,您可能也需要对迁移中包含的其他表执行类似操作,即类似这样(确保验证相应初始迁移中的名称):

    migrationBuilder.DropIndex(
        name: "IX_TaskList_UserId",
        table: "TaskList");
    
    migrationBuilder.DropIndex(
        name: "IX_Template_UserId",
        table: "Template");
    

    然后:

    migrationBuilder.CreateIndex(
        name: "IX_TaskList_UserId",
        table: "TaskList",
        column: "UserId");
    
    migrationBuilder.CreateIndex(
        name: "IX_Template_UserId",
        table: "Template",
        column: "UserId");
    

    【讨论】:

    • 对迁移的 Down() 部分执行相同操作。
    • 自己打这个,很明显这个错误还没有修复。
    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2020-11-24
    • 2018-09-02
    • 2023-03-09
    • 1970-01-01
    • 2018-05-22
    • 2013-05-18
    相关资源
    最近更新 更多