web-dev-qa-db-ja.com

列のIDENTITYプロパティを変更します。列を削除して再作成する必要があります

EF Core 2.1を使用しています

これが私の最初のモデル定義でした。

public class Customer //Parent
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }

    public BankAccount BankAccount { get; set; }

}


public class BankAccount
{
    public int Id { get; set; }

    public string Branch { get; set; }

    public string AcntNumber { get; set; }

    public DateTime CreatedDate { get; set; }

    public int CustomerId { get; set; }

    public Customer Customer { get; set; }

}

しかし、IdCustomerIdの両方が1対1の関係としてオーバーヘッドであることに気づき、BankAccountモデル定義を以下のように更新できます。

public class BankAccount
{
    public int Id { get; set; }

    public string Branch { get; set; }

    public string AcntNumber { get; set; }

    public DateTime CreatedDate { get; set; }

    public Customer Customer { get; set; }

}

DbContextクラスでは、以下のようにプリンシパルエンティティを定義しました。

HasOne(b => b.Customer).WithOne(c => c.BankAccount).HasForeignKey<BankAccount>(f => f.Id);

update-databaseの実行中に、次のエラーが表示されます。

System.InvalidOperationException:列のIDENTITYプロパティを変更するには、列を削除して再作成する必要があります。

ただし、理想的には、このエラーを取り除くだけではなく、列、制約、テーブル、そしてデータベース全体を削除します。しかし、それでも同じエラーです。

8
Kgn-web

私は同じ問題にぶつかり、2つのステップと2つの移行によってそれを解決しました。

  1. ID列をドロップし、BankAccountのIdにコメントを付けて、新しいID、つまりBankAccountIdをIDとして追加し、移行と更新を追加します。これにより、IDがドロップされ、IDとして新しい列が追加されます。
  2. 新しい追加列を削除し、前の列を再度追加し、BankAccountIdをコメントし、Idをコメント解除し、移行と更新を追加します。これにより、BankAccountIdが削除され、IDがIDとして追加されます。
5
Hani

このエラーは、スキーマまたは既に存在するテーブルを変更するときに、既に存在するテーブルを変更または変更しようとすると発生します。これについてできることは次のとおりです。

  • このエラーを回避するには、移行ファイルの関連コードをコメント化します。
  • または移行ファイルを削除して、新しいものを作成します。
  • アップストリームの移行を削除し、移行に新しいコードを生成させます。
2

モデルをpublic byte Id {get; set;}からpublic int Id {get; set;}に変更しようとしたときにこの問題が発生しました。この問題に直面するために、私は次のことを行いました。

  1. パッケージマネージャーコンソールでRemove-Migration -Project <target_project>を使用してターゲットモデルを作成するまで、すべての移行を削除します
  2. 実際のデータベースを削除する
  3. 中間に作成していない移行がある場合(たとえば、別のブランチからのもの)、移行ファイルとModelSnapshotファイルもコピーして、ブランチに貼り付けます(慎重に上書きしてください!) 。
  4. パッケージマネージャーコンソールでadd-migration <migration_name>を使用して新しい移行を作成します
  5. パッケージマネージャーコンソールでupdate-databaseを使用してデータベースを更新する

私のコードは実稼働環境ではなかったため、この方法で解決できます。モデルが既に存在する場合、別の複雑な問題に直面する必要があるかもしれません。

2
Tito Leiva

Migrationsフォルダーと、自動生成された_EFMigrationHistoryテーブルを削除します。 Package ManagerコンソールでAdd-Migration MigrationNameを再度実行し、Update-Databaseコマンドを実行すると、問題は解決しました。

1
Auguste