2011-08-22 32 views
27

我有两个实体之间的核心数据的关系,这是这样的:Coredata删除规则混乱,Xcode中

Entity A      Entity B 
aRelationship <-------------->> bRelationship 

通过删除规则设置为级联。

也许我都有这个毛病,但我认为,如果对于这两种关系的删除规则设置为“级联”,做了以下...

[context deleteObject:EntityA]; 

那么当...这将还删除与其关联的所有实体B.但是,当我登录所有实体B的时候,似乎我错了。

难道有人请澄清一下我的困惑吗?

非常感谢。

回答

90

虽然它在图形化数据模型编辑器是不会立即显现每一recipocal关系即每个

<--> 

...实际上是两个各有各的DELET独立关系e规则。当删除规则的实体的对象被删除时,删除规则被激活。

所以,如果在数据模型编辑器,你有两个实体AlphaBeta有关系:

Alpha.betas<-->>Beta.alpha 

...那么你真的有像这样两个关系:

Alpha.betas--(delete rule)-->>Beta.alpha 
Beta.alpha--(delete rule)-->Alpha.betas 

从来没有想要建立这样的删除规则:

Alpha.betas--(cascade)-->>Beta.alpha 
Beta.alpha--(cascade)-->Alpha.betas 

...因为删除任何一个Beta实例将删除关联的Alpha对象,该对象将触发删除所有相关的对象Beta。根据数据模型的细节,相互级联可能会意外删除大部分数据。

你真正想要的是:

Alpha.betas--(cascade)-->>Beta.alpha 
Beta.alpha--(nullify)-->Alpha.betas 

现在,当你删除Alpha对象,它会删除所有相关Beta对象。

级联被阻塞时,通常会出现所需关系的问题。如果没有数据模型的细节,就无法确定。

+0

快速的问题,当我运行'[上下文deleteObject:EntityA];'这将确保所有的测试版被删除正确,如果我有它的设置就像你在最后一段代码? –

+0

假设没有其他东西阻止删除。 – TechZen

+0

但是如果我删除所有Betas?如何在这种情况下自动删除Alpha? – shoumikhin

3

这取决于您使用的删除规则。

这里是苹果公司自己的文件中称:

“当你删除一个管理对象重要的是要考虑其 关系,特别是对 关系中指定的删除规则如果所有的。被管理对象的关系删除规则 为Nullify,那么对于该对象,至少没有其他工作要做 (您可能不得不考虑处于关系目标 处的其他对象 - 如果反向关系是 强制的或在基数上有一个下限,然后是th e目标 对象或对象可能处于无效状态)。如果关系 删除规则是层叠,则删除一个对象可能导致其他人删除 。如果规则为拒绝,那么在删除 对象之前,必须从 关系中删除目标对象或对象,否则保存时会出现验证错误。 如果删除规则是不采取行动,那么你必须确保你采取 一切必要步骤,确保对象 图的完整性“

的链接‘关系删除规则’:。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1