2011-08-22 2 views
27

나는 다음과 같은 두 개의 엔티티 사이의 코어 데이터의 관계를 가지고있다.Coredata 삭제 규칙 혼란, 엑스 코드

는 어쩌면 나는이 잘못을 가지고,하지만 난 생각이 관계를 모두 삭제 규칙이 "캐스케이드"로 설정된 경우 다음 ...

[context deleteObject:EntityA]; 

을 한 후 때, ...는 것 그것과 관련된 엔티티 B도 모두 삭제하십시오. 그러나 모든 엔티티 B를 기록 할 때 실수로 보입니다.

누군가 내 혼란을 피할 수 있을까요?

대단히 감사합니다.

답변

90

은 즉 각

<--> 

각 recipocal 관계가 그래픽 데이터 모델 편집기에서 즉시 분명 아니지만이 ... 정말 그 자신의 delet을 가진 두 개의 분리 된 관계 각이다 전자 규칙. 삭제 규칙이있는 엔티티의 개체가 삭제되면 삭제 규칙이 활성화됩니다.데이터 모델 편집기에서 당신이 관계 두 단체 AlphaBeta이있는 경우

그래서 :

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

당신 :

Alpha.betas<-->>Beta.alpha 

을 ... 당신은 정말 그렇게 같은이 개 관계를 never 다음과 같은 삭제 규칙을 설정하고 싶습니다.

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

... Beta 인스턴스를 삭제하면 관련된 모든 Beta 개체의 삭제를 트리거하는 연관 Alpha 개체가 삭제되므로 데이터 모델의 세부 사항에 따라 상호 캐스케이드는 우연히 큰 데이터 청크를 삭제할 수 있습니다.

당신이 진정으로 원하는 것은 : 당신이 Alpha 개체를 삭제할 때

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

지금, 그것은 모든 관련 Beta 오브젝트를 삭제합니다.

캐스케이드가 차단되면 일반적으로 필요한 관계에서 문제가됩니다. 데이터 모델의 세부 사항 없이는 확실하게 알 수 없습니다.

+0

빠른 질문,'[context deleteObject : EntityA];를 실행하면 모든 베타가 바로 삭제 될 것입니다. 마지막으로 코드 스 니핏에서 설정 한 것처럼 설정하면됩니다. –

+0

삭제를 차단하는 다른 것이 없다고 가정합니다. – TechZen

+0

그러나 베타를 모두 삭제하면 어떻게됩니까? 이런 경우 자동으로 Alpha를 삭제하는 방법은 무엇입니까? – shoumikhin

3

어떤 삭제 규칙을 사용하고 있는지에 따라 다릅니다. 여기

애플이 자신의 문서에서 말한 :

"당신은 그것의 관계를 고려하는 것이 중요하며 관계에 대해 지정된 삭제 규칙 특히 관리되는 개체를 삭제할 때의 경우 모두를. 관리 대상 객체의 관계 삭제 규칙 이 무효 인 경우 해당 객체에 대해 최소한 추가 작업이 없음 (역 대상이 인 경우 관계의 대상인 에 있었던 다른 객체를 고려해야 할 수도 있음) 카디널리티에 대한 하한선이 낮 으면 th e 대상 개체 또는 개체가 잘못된 상태 일 수 있습니다. 관계 관계 삭제가 계단식이면 하나의 개체를 삭제하면 이 삭제 될 수 있습니다. 규칙이 거부 인 경우 개체를 삭제하기 전에 관계에서 대상 개체를 제거해야합니다. 그렇지 않으면 저장시 유효성 검사 오류가 발생합니다. 삭제 규칙이 없음 조치가없는 경우 , 당신은 당신이 개체 그래프의 무결성을 보장하기위한 조치가 필요한 어떤 을 확인해야합니다 "

의 링크"관계가 규칙을 삭제를 ".. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1