21

我只是想快速检查一下。假设我在数据模型中有两个实体:目录和产品。它们之间是多对多的关系,并且两者都是必需的(一个目录必须至少有一个产品,并且所有产品都必须分别属于至少一个目录)。所以如果我要删除一个产品,它的删除当然应该是 Nullify。

但是目录的删除策略应该是什么?如果目录被删除,则并非其所有产品都必须完全属于该目录。一个产品可能属于多个目录。所以我绝对不应该使用 Cascade。但是,Nullify 就足够了吗?如果我最终得到不属于目录的悬空产品怎么办?Core Data 内置了什么可以解决多对多模式的这个问题?我需要修改我的架构吗?

4

3 回答 3

23

Nullify 就足够了,而且多对多听起来是对的。但是,您想要的特定约束(删除孤儿)不能直接由核心数据强制执行,因此您可以自己进行一些清理。

具体来说,willSave在你的实体类中实现,并让每个实体测试:我没有被删除吗?而且,我没有相关的(产品/目录)吗?如果是这样,请删除我自己。(未删除的测试对于避免willSaves 的无限循环很重要。)

这会推迟删除孤立的目录或产品,直到节省时间。这可能不是问题。

于 2011-02-19T06:44:46.490 回答
13

我已经实现了 rgeorge 的答案,并认为确切的代码可能对其他人有帮助:

- (void)willSave
{
    [super willSave];

    if (self.isDeleted)
        return;

    if (self.products.count == 0)
        [self.managedObjectContext deleteObject:self];
}
于 2012-07-18T20:30:07.173 回答
1

安迪和约瑟夫的快速翻译

override func willSave() {
    super.willSave()

    if self.deleted {
      return
    }

    if self.products.count == 0 {
      self.managedObjectContext?.deleteObject(self)
    }
  }
于 2015-10-14T17:20:22.380 回答