28

コード ファーストを使用して、テーブルで CASCADE DELETE を有効にしたいと考えています。モデルをゼロから再作成すると、関係が自動的に設定されても、CASCADE DELETE は設定されません。奇妙なことは、多対多の関係を持つ一部のテーブルでこれを有効にしていることです。これには問題があると思われます。

セットアップ: テーブル A <- テーブル B.

テーブル B の FK は、テーブル A の PK を指します。

なぜこれがうまくいかないのでしょうか?

4

2 に答える 2

57

カスケード削除を取得できない理由として考えられるのは、関係がオプションであるということです。例:

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、カスケード削除を設定するためです。

詳細については、ドキュメントを参照してください

于 2011-03-29T11:18:55.860 に答える
0
modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);
于 2015-02-05T11:34:55.890 に答える