React Native Realm:如果尝试删除引用子对象的父对象,则会发生错误

问题描述 投票:0回答:1

我有一个 Realm 对象,它是另一个子对象的父对象。父母持有与孩子的关系参考。当我尝试删除父对象时,它会被删除而不会引发任何错误,并且子元素仍然存在。但是,我想要一种行为,使得包含子对象的父对象不能被删除,除非子对象被删除。

有嵌入式对象解决方案(https://www.mongodb.com/docs/realm/sdk/react-native/model-data/relationships-and-embedded-objects/#embedded-objects)。虽然子对象确实属于父对象并且没有它就不应该存在,但我确实希望它们具有嵌入对象不允许拥有的主键。原因是因为我希望能够通过主键访问子对象,而不需要通过关系链。例如,我可以有这样的关系:parent -> child1 -> child2 -> child3。如果我使用嵌入对象,那么要检索 child3,我必须遍历整个链。通过主键,我可以直接访问所需的对象。

问题是:是否有某种配置可以覆盖默认的“允许删除父对象,无论它是否有子对象”,而“仅当父对象不包含对子对象的引用时才允许删除”?与关系数据库对外键的处理类似。 如果这是不可能的,那么有没有一种方法可以访问深度嵌套的子级而不通过整个链?

javascript react-native realm
1个回答
0
投票

所描述的行为是 Realm 的工作方式,并且是设计使然。

没有什么可以阻止与另一个对象“相关”的对象被删除。 Realm 对象是独立的对象,它们的生命周期不依赖于其他对象。事实上,在 Realm 对象图中,没有父对象和子对象,只有相关对象。 嵌入对象不同,因为它在存储时不是对象;它实际上是父对象图的一部分,因此当父对象被删除时,嵌入的对象也会被删除。这就是为什么嵌入对象没有自己的密钥;它们不是独立管理的对象。

您所问的问题听起来像是级联删除 - 删除一个对象将删除相关的对象。这本身就很棘手,因为“多对多关系”是领域的一部分;如果删除一个对象会删除它的相关对象,但这些对象实际上与另一个对象相关怎么办?这会变得混乱。

一种策略是使用嵌入式对象 - 正如问题中提到的,这个parent -> child1 -> child2 -> child3 可能具有挑战性,但如果这是结构,可能会有更好的图表。 我们使用的技术是简单地询问对象是否是“孩子”,例如相关对象是否有任何其他关系,如果没有,则删除“父”和“子”对象。我们通过

LinkingObjects

利用逆关系

一些伪代码 ParentObject { childList: a list of child objects function isOkToDelete -> Bool { iterate over each child in the list and see if it has an inverse relationship if none do, return true as it's ok to delete } } ChildObject { parentObjects: a reference to the parent object(s), LinkingObjects }

在子对象中,父对象将是链接对象的类型。 Realm 完全支持多对多关系,因此属性可以与 0 个或多个父对象具有反向关系。

如果parentObjects.count = 1,那么它只与该ParentObject相关,可以删除。

如果所有子对象只有一个父对象,则可以通过编程方式实现级联删除,删除每个子对象,然后删除父对象。

© www.soinside.com 2019 - 2024. All rights reserved.