问题标签 [cascading-deletes]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4216 浏览

entity-framework - 在实体框架中删除对象及其所有子对象?

我一直试图在这里找到这个问题的答案。似乎有几个人问过类似的问题,但我没有得到答案。我有一个带有一堆子实体(一对多关系)的 EF 实体。我希望能够删除“父”实体并同时删除所有子实体。

有人提到应该在 EF 模型和数据库(在我的例子中是 Sql Server)上设置“级联删除”。问题是:

  1. 我完全不知道如何做到这一点(似乎暗示在你应该知道的那些答案中,但抱歉......)
  2. 我有一种感觉,我以前遇到过类似的问题,并在比设置此 Cascade Delete 更简单的地方找到了答案。我可能错了,也许这是唯一的方法,但如果有更简单的解决方案,我想知道。

在任何一种情况下,将不胜感激如何获得此工作的清晰示例!

0 投票
1 回答
3633 浏览

sql-server - SQL Server 2008 - 多个级联 FK - 我需要触发器吗?

我在UserPost之间有 1..* 关系。(一个用户有很多帖子)

Post有一个名为“UserId”的 FK,它映射到User表上的“UserId”字段。

我试图将此 FK 设置为 Cascade UPDATE/DELETE,但出现此错误:

“用户”表已成功保存“帖子”表 - 无法创建关系“FK_Posts_Users”。
在表 'Posts' 上引入 FOREIGN KEY 约束 'FK_Posts_Users' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束。请参阅以前的错误。

我有一张名为PostHelpful 的表。一篇文章有​​很多有用的。

Helpful 对 User 有一个级联的 FK(所以当一个 User 被删除时,他们的 Helpful 也会被删除)。

但我认为这是抱怨“多级联路径”的原因。

因为如果我删除用户(当前),它将删除他们的帮助。但是我也试图向 Post 添加一个级联,这样做会删除 Post,然后尝试删除该 Post 的 Helpful(因为 Helpful 也有一个级联的 FK 到 Post)。在那种情况下,SQL 会选择哪个级联 FK?

这是有问题的三个表的数据库图:

在此处输入图像描述

如您所见,“PostHelpful”是“Post”和“User”的子项(两者都有 FK)。

所以我不能让两个键级联?我是否需要在“用户”上触发(删除后)来手动删除帮助(以及引用用户的其他表)。

0 投票
1 回答
97 浏览

mysql - 帮我保存我的数据库

我最近将我的数据库迁移到了另一台服务器。

在旧服务器上,我大量使用了 InnoDB 的 ON DELETE CASCADE 规则。

在新服务器上,MySql 没有设置 InnoDB 引擎。

在迁移时,新服务器默认使用 MyISAM - 直到现在我才注意到这一点。(头撞墙!)

所以,情况是这样的:因为数据库一直在使用,我的一些使用 ON DELETE CASCADE 规则的表现在不同步了。(仍然用头撞墙。)

这意味着我不能只是将表更改为 InnoDB 并重新应用级联规则——一些键现在引用不再存在的行。

我的问题是这样的:

有没有办法配置 INSERT 语句,以便如果插入的任何行违反级联规则,它只是默默地忽略该行并移动到下一行?(起初我以为 INSERT IGNORE 会做到这一点,但我已经尝试过了,它似乎不起作用。)

在此先感谢您的帮助

0 投票
2 回答
2261 浏览

c# - NHibernate 级联删除

让我从显示映射开始:

家长:

孩子:

换句话说:一个配置文件可以有许多沟通渠道。

在 UI(用户界面[ASP.NET Webforms])上触发以下事件(删除附加了通信通道的配置文件):

(DaoFactory 位于一个项目文件中,UI 是一个 ASP.NET 网站)

此代码有效。

重要提示:代码使用 NHibernate 'open-session-in-view' 模式。

我有一个触发相同代码的服务实现(删除带有通信渠道的配置文件)。一些代码...

'EndTransaction()' 执行'提交'的地方。我用“单元测试”测试这段代码:

此代码失败。以下错误困扰着我:

DELETE 语句与 REFERENCE 约束“R2_PROFIEL”冲突。冲突发生在数据库“CRM_ontw”、表“dbo.COMMUNICATIEKANAAL”、列“SEK_PROFIEL”中。该语句已终止。

这意味着级联根本没有发生。从UI执行它可以工作,但是当从“服务实现”触发时,它会失败。有什么想法或建议可以帮助我吗?

提前致谢


编辑:以下通用代码删除是一个对象

设置all-delete-orphan并不能解决问题。

0 投票
1 回答
8032 浏览

mysql - 如何在 MySQL MyISAM 存储引擎上使用删除级联?

我有一张我称之为设备的表,还有另外 8 张我称之为 device_child1 的表,依此类推,直到device_child8

所有这些表之间的公共字段是cod_equip,通过该字段,我可以使用设备父表识别我的所有子设备表。

我需要在设备移动时从设备中删除数据,但我需要删除我所有表中的数据设备_child1到设备_child8。

然后我记得我在innoDB引擎中使用过DELETE CASCADE,但现在我使用的是MyISAM engina,这是个问题吗?

任何帮助,都会真正澄清......

0 投票
2 回答
2344 浏览

nhibernate - 双向一对多(或多对一)级联删除行为。它有效,但为什么呢?

我有两个类的两个 Nhibernate 映射,类别和产品。我的 Category 类有两个属性是集合。Children 属性是一个 Category 类型的集合,它代表子类别(代表一个类别菜单,典型的父子场景)。Category 类的第二个属性是 Products 集合,它代表一个类别下的所有产品。

我想要实现的是当我删除一个类别时,我希望删除该类别而不是产品。所以我希望产品成为孤儿。即在Product 表中将其外键(CategoryId) 设置为null。我不想仅仅因为我删除了一个类别就删除了一个产品。我希望以后能够重新分配到另一个类别。我的代表上述场景的映射如下。

使用此映射,当我删除具有与之关联的产品的类别时,我会收到以下约束错误。

DELETE 语句与 REFERENCE 约束“fk_Category_Product”冲突。冲突发生在数据库“naakud”、表“dbo.Product”、列“CategoryId”中。该语句已终止。

但是,当我在 Category 映射中删除 Products 集合上的 inverse=true 属性时,它可以正常工作。我在 products 表中的 CategoryId 外键设置为 null,从而取消了产品与类别的关联。这就是我想要的。

我已经阅读了有关 inverse 属性的信息,并且我理解它表示关系的拥有方,并且更新/插入/删除以不同的顺序完成,这就是我认为它解决了我的问题的原因。所以我的问题是,我是否以正确的方式解决了我的问题?这对性能有何影响?(我怀疑不多)。是否有一个单向关系而没有多向一侧并将反向属性设置为 true 以获得更好的性能?还是我要疯了,完全错过了重点?

0 投票
1 回答
8114 浏览

entity-framework - 在 EF Code First 中启用级联删除而不暴露外键

在不公开外键的情况下执行一对多关系的删除时,EF 会删除父记录并尝试使子记录上的外键为空。这当然会导致错误,因为外键不可为空。将外键添加到子类会覆盖此行为,但我宁愿不公开它。

例如,给定以下两个类,我不希望 JobId 作为 Project 类的属性。

有没有办法在 EF Code First 中启用级联删除而不在关系的多方面暴露外键?

0 投票
1 回答
6212 浏览

sqlite - 如何使用复合主外键在 SQLite 数据库上设置级联?

我有一个由超类型表和子类型表构成的数据库,如下所示:

不同类型的事件有自己的表并且具有相同的主键,只是它是外来的。

当我尝试在事件中删除一个条目时,我得到一个外键不匹配,当我在练习中删除它时它会删除,但在练习中..它不会级联。我需要做什么才能使级联正常工作?我宁愿删除 Event 中的条目并将其级联到Exercise ..从我看到的示例中看起来它应该如何工作......

0 投票
1 回答
3536 浏览

ef-code-first - EF 4.1 RC:奇怪的级联删除

我不得不承认,EF 4.1 RC Codefirst、DataAnnotations 和 FluentAPI 的特性对我来说仍然是压倒性的。有时我真的不知道自己在做什么 ;-) 请参阅以下 POCO:

总体思路:每个国家都需要有一种货币。但是货币根本不需要分配给一个国家。

如果让 EF 创建相应的数据库,则按照约定将关系设置为 CASCADE DELETE。换句话说:如果您删除一种货币,相应的国家也会被删除。但就我而言,这不是我想要的。

为了禁用 CASCADE DELETE,我在 FluentAPI 中提出了一些代码:

我认为这意味着:每个国家都需要一种货币。并且这种货币可能分配了零个、一个或多个国家/地区(可选)。并且每当我删除一种货币时,相应的国家(如果有的话)将不会被级联删除。

令人惊讶的是,如果我删除相应的货币,给定的方法仍然会级联删除一个国家/地区。谁能告诉我我想念什么?

0 投票
2 回答
36517 浏览

entity-framework - 使用实体框架级联删除 - EF 删除的相关实体

我在实体框架中遇到了删除问题。简而言之,即使我已明确将 EF 配置为在数据库中使用级联删除,EF 也会显式尝试从数据库中删除实体。

我的设计:

我有三种实体类型MainEntityEntityTypeAEntityTypeB。EF 已配置为在删除EntityTypeA和时使用级联删除EntityTypeB。换句话说,如果我删除 的一个实例MainEntity,我希望也删除所有相关EntityTypeAEntityTypeB实例。我从不删除EntityTypeAEntityTypeB不删除他们的父母。

我的问题是 EF 明确发出DELETEfor 的语句EntityTypeA,这导致我的应用程序崩溃。

这是我的模型的样子:

这些关系具有以下非默认配置:

  • MainEntity -> EntityTypeA OnDelete: Cascade
  • MainEntity -> EntityTypeB OnDelete: Cascade

关系EntityTypeA -> EntityTypeBOnDelete: None

数据库内容

我的代码:

发生什么了

当我调用 SaveChanges 时,Entity Framework 在数据库中执行以下操作:

这会导致外键违规,因为 EntityTypeB 的表中存在引用 EntityTypeA 实例的项目。

问题

即使我已将 Entity Framework 配置为使用级联删除,为什么 Entity Framework 仍会为 EntityTypeA 的实例发出显式删除?如果我删除 Include("EntityTypeA") 它会再次开始工作。