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; }
}
しかし、Id
とCustomerId
の両方が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プロパティを変更するには、列を削除して再作成する必要があります。
ただし、理想的には、このエラーを取り除くだけではなく、列、制約、テーブル、そしてデータベース全体を削除します。しかし、それでも同じエラーです。
私は同じ問題にぶつかり、2つのステップと2つの移行によってそれを解決しました。
このエラーは、スキーマまたは既に存在するテーブルを変更するときに、既に存在するテーブルを変更または変更しようとすると発生します。これについてできることは次のとおりです。
モデルをpublic byte Id {get; set;}
からpublic int Id {get; set;}
に変更しようとしたときにこの問題が発生しました。この問題に直面するために、私は次のことを行いました。
Remove-Migration -Project <target_project>
を使用してターゲットモデルを作成するまで、すべての移行を削除しますModelSnapshot
ファイルもコピーして、ブランチに貼り付けます(慎重に上書きしてください!) 。add-migration <migration_name>
を使用して新しい移行を作成しますupdate-database
を使用してデータベースを更新する私のコードは実稼働環境ではなかったため、この方法で解決できます。モデルが既に存在する場合、別の複雑な問題に直面する必要があるかもしれません。
Migrationsフォルダーと、自動生成された_EFMigrationHistory
テーブルを削除します。 Package ManagerコンソールでAdd-Migration
MigrationNameを再度実行し、Update-Database
コマンドを実行すると、問題は解決しました。