コード ファーストを使用して、テーブルで CASCADE DELETE を有効にしたいと考えています。モデルをゼロから再作成すると、関係が自動的に設定されても、CASCADE DELETE は設定されません。奇妙なことは、多対多の関係を持つ一部のテーブルでこれを有効にしていることです。これには問題があると思われます。
セットアップ: テーブル A <- テーブル B.
テーブル B の FK は、テーブル A の PK を指します。
なぜこれがうまくいかないのでしょうか?
コード ファーストを使用して、テーブルで CASCADE DELETE を有効にしたいと考えています。モデルをゼロから再作成すると、関係が自動的に設定されても、CASCADE DELETE は設定されません。奇妙なことは、多対多の関係を持つ一部のテーブルでこれを有効にしていることです。これには問題があると思われます。
セットアップ: テーブル A <- テーブル B.
テーブル B の FK は、テーブル A の PK を指します。
なぜこれがうまくいかないのでしょうか?
カスケード削除を取得できない理由として考えられるのは、関係がオプションであるということです。例:
public class Category
{
public int CategoryId { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public Category Category { get; set; }
}
このモデルでは、Category テーブルへの外部キーを持つ Product テーブルを取得しますが、このキーは null 可能であり、データベースにはデフォルトでカスケード削除設定がありません。
関係を必要とする場合は、次の 2 つのオプションがあります。
注釈:
public class Product
{
public int ProductId { get; set; }
[Required]
public Category Category { get; set; }
}
流暢な API:
modelBuilder.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany();
どちらの場合も、カスケード削除が自動的に構成されます。
リレーションシップをオプションにしたいが、WITH カスケード削除が必要な場合は、これを明示的に構成する必要があります。
modelBuilder.Entity<Product>()
.HasOptional(p => p.Category)
.WithMany()
.WillCascadeOnDelete(true);
編集: 最後のコード スニペットでは、単純に.WillCascadeOnDelete()
. このパラメーターなしのオーバーロードの既定値はtrue
、カスケード削除を設定するためです。
詳細については、ドキュメントを参照してください
modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);