0

を実行すると、次のエラーメッセージが表示されます。Update-Database failed: "インデックス 'IX_Task_UserId'が 'UserId'列に依存しています。"

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

マイアップ()の移行は次のようになります。

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

私はエラーが何を参照するか、インデックスわからないんだけど、また外部キーがドロップされている理由を、私は完全に再び(理解してください私がしたことは、いくつかのプロパティをnull不可能にすることでした)。助けてくれてありがとう。

答えて

2

私がしたすべては、いくつかのプロパティがnull非許容作りました

まあ、通常は(オプション)のNullableするために、非NULL可能(必須)テーブル列を変換する問題ではなく、反対はありません、それでは、事前に慎重に考えることは良いことです。

ここでの「少し」の問題は、ほとんどのプロパティのほとんどが外部キーであり、変換を複雑にします。 EFコアの自動生成マイグレーションは、列を変更して後で再作成する前に、FK制約を削除することによってそれを正しく処理しようとします。残念なことに、FK制約には通常インデックスが関連付けられています(たとえば、 "FK_Task_AspNetUsers_UserId"という名前で作成された移行が見つかった場合は、インデックス "IX_Task_UserId"も作成されます)、インデックスを削除して再作成することも忘れてしまいます。あなたが得ている例外(データベースから来ている)。

したがって、生成された移行を手動で修正する必要があります(EFコアリポジトリにバグレポートを投稿することも考えられます)。これを行うには

、最初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"); 
関連する問題