2011-08-22 12 views
27

Mam relację Rdzeń danych pomiędzy dwoma podmiotami, które jest tak:CoreData usuwać reguła splątanie, Xcode

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

Z regułę usuwania ustawionym na kaskadę.

Może mam to źle, ale pomyślałem, że jeśli regułą usuwania dla obu tych relacji był ustawiony na „Kaskada”, a następnie, gdy zrobiliśmy następujące ...

[context deleteObject:EntityA]; 

... to byłoby usuń także wszystkie powiązane z nim Obiekty B. Jednak kiedy loguję wszystkie moje jednostki B, wydaje mi się, że się mylę.

Czy ktoś mógłby rzucić trochę światła na moje zamieszanie?

Dziękuję bardzo.

Odpowiedz

90

Chociaż to nie jest od razu widoczne w edytorze graficznym modelu danych każdy recipocal związek tj każdego

<--> 

... jest naprawdę dwa oddzielne relacje każdy z własnym delet Reguła e. Reguły usuwania są aktywowane, gdy obiekt obiektu z zasadą usuwania zostanie usunięty.

Tak więc, jeśli w edytorze model danych masz dwa podmioty Alpha i Beta z zależnością:

Alpha.betas<-->>Beta.alpha 

... to naprawdę masz dwie relacje tak:

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

You nigdy chcesz ustawić regułę usuwania tak:

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

... ponieważ usunięcie dowolnej instancji Beta spowoduje usunięcie obiektu stowarzyszonego Alpha, co spowoduje usunięcie wszystkich powiązanych obiektów Beta. W zależności od szczegółów twojego modelu danych, wzajemna kaskada może przez przypadek usunąć dużą część twoich danych.

Co naprawdę chcesz to:

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

Teraz, gdy obiekt Alpha usunąć, to usunie wszystkie związane Beta obiektów.

Gdy kaskada jest zablokowana, zwykle jest to problem z wymaganą relacją. Nie można powiedzieć na pewno bez szczegółowych danych modelu danych.

+0

Szybkie pytanie, kiedy uruchamiam '[context deleteObject: EntityA]; 'to zapewni, że wszystkie bety zostaną usunięte poprawnie, jeśli mam je ustawione tak jak w ostatnim snibicie kodu? –

+0

Zakładając, że nie ma czegoś innego, co blokuje usuwanie. – TechZen

+0

Ale co, jeśli usunę wszystkie bety? Jak w takim przypadku automatycznie usunąć alfa? – shoumikhin

3

To zależy od tego, jakich reguł usuwania używasz.

Oto co Apple powiedział w swoim dokumencie:

„Po usunięciu zarządzanego obiektu ważne jest, aby rozważyć swoje relacje aw szczególności usunąć reguły określone dla relacji Jeśli wszystko a. zarządzane reguły usuwania relacji między obiektami są Nullify, to przynajmniej dla tego obiektu nie ma dodatkowej pracy do wykonania (może być konieczne rozważenie innych obiektów, które znajdowały się w docelowym położeniu relacji - jeśli odwrotna zależność była albo obowiązkowa, albo ; miał niższy limit liczności, a następnie e obiekt docelowy obiekt lub obiekty mogą być w nieprawidłowym stanie). Jeśli reguła usuwania relacji to Kaskada, usunięcie jednego obiektu może spowodować usunięcie innych. Jeśli reguła ma wartość Odmów, przed usunięciem obiektu należy usunąć obiekt docelowy lub obiekty z relacji , w przeciwnym razie po zapisaniu pojawi się błąd sprawdzania poprawności. Jeżeli kasowania reguła ma działania, należy upewnić się, że bierzesz wszelkie niezbędne kroki w celu zapewnienia integralności wykresu obiektu „

linku«Powiązania usunąć reguły»:.. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1