gpt4 book ai didi

entity-framework - 在多对多链接表上选择性地禁用级联删除

转载 作者:行者123 更新时间:2023-12-04 08:33:12 25 4
gpt4 key购买 nike

是否可以在 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 来禁用所有多对多连接的级联删除。根据 this question ,但这不是我所追求的 - 我只想能够为一种关系做到这一点,或者理想情况下是一种关系的一侧。

最佳答案

我怀疑在 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 来做到这一点,那就太好了,但我还没有设法找到一种方法来做到这一点

关于entity-framework - 在多对多链接表上选择性地禁用级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13726014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com