在多对多链接表上有选择地禁用级联删除

Ric*_*ard 7 entity-framework ef-code-first entity-framework-5

是否可以在Entity Framework 5 Code First中自动生成的多对多链接表中有选择地删除Cascade Delete选项?这是一个需要它的简单示例:

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; }
}
Run Code Online (Sandbox Code Playgroud)

由于链接表上引入了级联删除选项,因此当前形式的此上下文将不适用于数据库.如果我要创建一个手动链接表,我可以使用Fluent API将其中一方配置为不级联,但该选项在多对多关系中不可用.

我知道,我可以在所有的许多一对多的连接通过移除禁用级联删除ManyToManyCascadeDeleteConvention这个问题,但是这不是我后-我只是希望能够做到这一点的一个关系,或理想一个关系的一面.

Col*_*lin 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);
Run Code Online (Sandbox Code Playgroud)

您应该能够通过将您不想级联的一侧更改为 false 来使其工作:

    .ForeignKey("dbo.ChildAs", t => t.ChildA_Id, cascadeDelete: false)
Run Code Online (Sandbox Code Playgroud)

如果你能像一对多一样使用 FluentAPI 来做到这一点,那就太好了,但我还没有找到一种方法来做到这一点