7

Entity Framework 5 Code Firstで自動生成された多対多リンクテーブルのカスケード削除オプションを選択的に削除することは可能ですか?これを必要とする簡単な例を次に示します。

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

    public virtual IList<ChildA> As { get; set; }
    public virtual IList<ChildB> Bs { get; set; }
}

public class ChildA
{
    public int Id { get; set; }
    [Required]
    public virtual Parent Parent { get; set; }

    public virtual IList<ChildB> ChildBJoins { get; set; }
}

public class ChildB
{
    public int Id { get; set; }
    [Required]
    public virtual Parent Parent { get; set; }

    public virtual IList<ChildA> ChildAJoins { get; set; }
}

public class TestContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<ChildA> As { get; set; }
    public DbSet<ChildB> Bs { get; set; }
}

リンクテーブルにカスケード削除オプションが導入されているため、現在の形式のこのコンテキストはデータベースには適用されません。手動リンクテーブルを作成する場合、Fluent APIを使用して、カスケードしないようにその片側を構成できますが、このオプションは多対多の関係では使用できません。

この質問のようにを削除することで、すべての多対多結合でカスケード削除を無効にできることを認識していますがManyToManyCascadeDeleteConvention、それは私が求めているものではありません-1つの関係に対して、または理想的にはそれを実行できるようにしたいだけです1つの関係の片側。

4

1 に答える 1

0

EntityTypeConfiguration マッピング クラスでそれを行う方法はないと思われますが、DbMigration クラスの Up() メソッドのコードを変更することで実現しました。

リンク テーブル用に生成されたコードは次のとおりです。

CreateTable(
    "dbo.ChildBChildAs",
    c => new
        {
            ChildB_Id = c.Int(nullable: false),
            ChildA_Id = c.Int(nullable: false),
        })
    .PrimaryKey(t => new { t.ChildB_Id, t.ChildA_Id })
    .ForeignKey("dbo.ChildBs", t => t.ChildB_Id, cascadeDelete: true)
    .ForeignKey("dbo.ChildAs", t => t.ChildA_Id, cascadeDelete: true)
    .Index(t => t.ChildB_Id)
    .Index(t => t.ChildA_Id);

カスケードしたくない側をfalseに変更することで、機能させることができるはずです。

    .ForeignKey("dbo.ChildAs", t => t.ChildA_Id, cascadeDelete: false)

1対多でできるようにFluentAPIを使ってできればいいのですが、どうにかしてそれを行う方法を見つけることができませんでした

于 2013-05-02T15:19:04.187 に答える