核心数据多对多关系的正确删除规则?

Posted

技术标签:

【中文标题】核心数据多对多关系的正确删除规则?【英文标题】:Correct Delete Rule for Core Data Many-to-Many Relationship? 【发布时间】:2013-11-06 20:17:28 【问题描述】:

在我的核心数据模型中,我有一个 Profile 实体,其中包含多个多对多关系。其中之一是“寻找”。许多个人资料可能会寻找许多不同的东西。

Core Data 中的关系将其删除规则设置为无效。我想要发生的是,当一个配置文件被删除时,所有正在寻找的条目都不会受到影响,而当一个正在寻找的条目被删除时,它应该从每个人的配置文件中删除。

这似乎我应该对 Profile 和 Find For 之间关系的两个方向都执行 No Action,但是通过谷歌搜索和阅读文档,我不确定这是正确的,实际上 No Action 似乎是什么除非您进行大量优化,否则您几乎永远都不想使用。这是文档:

无操作 对目的地的对象不做任何事情 关系。例如,如果您删除一个部门,则保留所有 员工,即使他们仍然相信自己属于那个 部门。

“无操作”规则可能有用的原因不太明显,因为如果 你使用它你有可能将对象图留在一个 不一致的状态(与已删除的员工有关系的员工 部门)。

如果您使用 No Action 规则,则由您来确保对象图的一致性 得到维护。您负责将任何反向关系设置为有意义的值。 这在您有一对多关系并且可能存在 目的地有大量物体。

所以我觉得我应该改用 Nullify(我目前正在使用),但 Nullify 的文档说:

无效 将目标对象的逆关系设置为 空值。例如,如果您删除一个部门,请将部门设置为 所有当前成员为空。这只有在 员工的部门关系是可选的,或者如果您确保 之前为每个员工设置了一个新部门 下次保存操作。

现在,正如所写的那样,这似乎意味着如果您删除个人资料,与该个人资料相关联的每个“寻找”都将清空其与个人资料的关系,即从所有个人资料中删除。

在这种情况下正确的做法是什么?

【问题讨论】:

【参考方案1】:

“无效”是正确的。假设 Profile p1 与 Look Fors l1l2l3 相关。如果 p1 被删除并且关系被设置为 Nullify,那么只有 p1 将从 l1l2l3 中的反向关系中删除。

使用“无操作”,l1l2l3 中的反向关系将保持不变, 因此指向一个不存在的元素p1。您必须删除 p1 从这些对象中“手动”。

换句话说,“Nullify”是保持对象图一致的最简单规则:如果ab相关,而b被删除,那么ba无关没有了。

【讨论】:

如果 p1 被删除并且没有其他配置文件与 l1l2l2l3 相关 - 应该删除这些“寻找”是有道理的。

以上是关于核心数据多对多关系的正确删除规则?的主要内容,如果未能解决你的问题,请参考以下文章

在多对多关系中删除正确

Cocoa – 核心数据对象图

保存循环删除多对多CoreData关系的一端

CoreData:如何建模循环多对多关系

在 NHibernate 中定义多对多关系以允许删除但避免重复记录的正确方法是啥

预加载具有多对多关系的核心数据的最佳实践