当前位置: 首页 > 知识库问答 >
问题:

全局禁用EF Core 2上的级联删除

周翰
2023-03-14

我需要了解全局禁用EF Core 2中级联删除的方法。感谢您的帮助。

在EF 6. x中,我们使用以下代码来禁用OneTo多ManyTo多实现上的级联删除:

builder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

共有3个答案

宋洲
2023-03-14

可能有帮助:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
ChangeTracker.CascadeDeleteTiming = ChangeTracking.CascadeTiming.Never;
ChangeTracker.DeleteOrphansTiming = ChangeTracking.CascadeTiming.Never;
}
充栋
2023-03-14
constraints: table =>
                {
                    table.PrimaryKey("PK_ComandaPlato", x => x.ComandaPlatoId);
                    table.ForeignKey(
                        name: "FK_ComandaPlato_Comanda_ComandaId",
                        column: x => x.ComandaId,
                        principalTable: "Comanda",
                        principalColumn: "ComandaId",
                        onDelete: ReferentialAction.Cascade);//default: cascade on
                    table.ForeignKey(
                        name: "FK_ComandaPlato_Plato_PlatoId",
                        column: x => x.PlatoId,
                        principalTable: "Plato",
                        principalColumn: "PlatoId",
                        onDelete: ReferentialAction.NoAction);//turn off cascade,"by hand"
                });
//comments: modifing the auto-generated migration, "harcode by hand" this attibute, as view bellow: change "Cascade" to "NoAction" (as view 1st and 2st examples)
金承嗣
2023-03-14

不幸的是,EF Core目前(最新版本为v2.0)并没有提供一种在全球范围内控制这些约定的好方法。

默认的EF Core 2.0约定是使用DeleteBePerformance or。Cascade用于必需和DeleteBeAct or。ClientSetNull用于可选关系。我可以建议作为解决方法的是OnModelCreating覆盖末尾的典型元数据模型循环。在这种情况下,定位所有已经发现的关系并相应地修改它们:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // ...

    var cascadeFKs = modelBuilder.Model.GetEntityTypes()
        .SelectMany(t => t.GetForeignKeys())
        .Where(fk => !fk.IsOwnership && fk.DeleteBehavior == DeleteBehavior.Cascade);

    foreach (var fk in cascadeFKs)
        fk.DeleteBehavior = DeleteBehavior.Restrict;

    base.OnModelCreating(modelBuilder);
}
 类似资料:
  • 我们正在启动一个新应用程序。我们想使用实体框架。我们几乎不怕意外删除sql行(尤其是意外设置相关数据等) 我想禁用每一次删除,因为我们只是用“validUntil”列标记每一行,而从不删除行。 我看到它可以通过sql中的角色来完成,但我希望所有逻辑和控制都只在代码中。 也许在实体框架核心中有新的特性来支持这一点?我知道它仍然可以用EF编写行sql,但我们并不害怕这种情况。 我还尝试删除实体关系的s

  • Django演示了如何设置或覆盖在文档中使用外键的级联删除。 但是如果我们想让这种效果反过来呢?如果我们希望fk模型的删除导致该模型的删除,该怎么办? 谢谢

  • 问题内容: 我有一个组件数据库。每个组件都是特定的类型。这意味着组件和类型之间存在多对一的关系。删除类型时,我想删除所有具有该类型外键的组件。但是,如果我没记错的话,级联删除将在删除组件时删除类型。有什么办法可以做我所描述的吗? 问题答案: 这就是您要包含在组件表中的内容。 请记住,您需要使用InnoDB存储引擎:默认的MyISAM存储引擎不支持外键。

  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建

  • 级联删除通常被用作数据库术语,用来描述删除一个数据行时自动删除关联的数据行的特征。EF Core 实现了一些不同的删除行为,并且允许对关联关系的删除行为进行配置。EF Core 还实现了相关的惯例,它会基于关系的必要性为每个关系配置有用的默认删除行为。 删除行为 删除行为是在 DeleteBehavior 枚举中定义的,可以将它传递给 OnDelete 流式 API 来控制主实体/父实体的删除是否