多对多结构中的删除

Apo*_*oad 21 many-to-many cascade core-data data-integrity

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

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

rge*_*rge 23

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

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

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


Jos*_*phH 13

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

- (void)willSave
{
    [super willSave];

    if (self.isDeleted)
        return;

    if (self.products.count == 0)
        [self.managedObjectContext deleteObject:self];
}
Run Code Online (Sandbox Code Playgroud)