Entity framework 选择性地禁用多对多链接表上的级联删除

Entity framework 选择性地禁用多对多链接表上的级联删除,entity-framework,ef-code-first,entity-framework-5,Entity Framework,Ef Code First,Entity Framework 5,是否可以先在EntityFramework5代码中自动生成的多对多链接表上有选择地删除级联删除选项?下面是一个需要它的简单示例: public class Parent { public int Id { get; set; } public virtual IList<ChildA> As { get; set; } public virtual IList<ChildB> Bs { get; set; } } public class Ch

是否可以先在EntityFramework5代码中自动生成的多对多链接表上有选择地删除级联删除选项?下面是一个需要它的简单示例:

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; }
}
公共类父类
{
公共int Id{get;set;}
公共虚拟IList为{get;set;}
公共虚拟IList Bs{get;set;}
}
公营儿童
{
公共int Id{get;set;}
[必需]
公共虚拟父级{get;set;}
公共虚拟IList子对象{get;set;}
}
公营儿童
{
公共int Id{get;set;}
[必需]
公共虚拟父级{get;set;}
公共虚拟IList ChildAJoins{get;set;}
}
公共类TestContext:DbContext
{
公共数据库集父项{get;set;}
公共数据库集为{get;set;}
公共数据库集Bs{get;set;}
}
此上下文的当前形式将不适用于数据库,因为链接表上引入了级联删除选项。如果我要创建一个手动链接表,我可以使用fluentapi将其一侧配置为不级联,但该选项在多对多关系中不可用


我知道我可以通过按照删除
manytomanycascadedeletection
来禁用所有多对多联接上的级联删除,但这不是我想要的-我只希望能够为一个关系执行此操作,或者理想情况下是一个relationsip的一侧。

我怀疑在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)

如果你能像一对多那样使用FluentAPI,那就太好了,但是我还没有找到解决问题的方法

您可能必须禁用
父-子a
父-子B
一对多关系上的级联删除才能解决问题。我不想这样做-我想保留该关系,并将其从多对多关系中删除。如果我创建手动链接实体,我可以这样做,但找不到自动链接实体的方法。这不是最好的解决方案,因为可能需要重新构建迁移,在这种情况下,您将丢失编辑。在EF 6中,您可以禁用约定,但这会关闭所有与
modelBuilder.Conventions.Remove()
的多对多关系,但这也可能不是必需的。@完全禁用约定肯定不会选择性地禁用它。也许最好的解决方案是创建一个手动链接实体,就像Richard在他的评论中发布的那样,但是如果你知道一个更好的方法,如果你发布它就太好了