Как правильно каскадировать удаленные управляемые объекты в Core Data?

У меня есть модель Core Data, которая имеет три объекта: A, B и C. A имеет отношение "один ко многим" с B, а B имеет отношение "многие ко многим" с C. Правило удаления для A → B - "Каскад", а B → A - "Нет действий". Правило удаления для B → C - "No Action", а C → B "Deny".

У меня возникают проблемы с удалением по объекту A. Я хочу, чтобы это произошло:

  • Я удаляю экземпляр A (используя deleteObject:)
  • Удаление распространяется на любой B, связанный с A (из-за правила удаления "Каскад" )
  • Все B, связанные с A, удаляются.
  • Любые связи, принадлежащие C, связанные с B были удалены, также удаляются

Это может быть немного запутанным, так что позвольте мне перефразировать: когда A удаляется, удалите все связанные B. И любой C, который ссылается на эти B, больше не должен ссылаться на них.

В моем тестировании я не вижу, чтобы правило удаления Cascade для меня вообще. Когда я удаляю A, я вызываю processPendingChanges сразу после этого (просто чтобы убедиться, что удаление выполнено). Затем я сравниваю число A и B, которые были в NSManagedObjectContext перед удалением, и после него. Экземпляр A был удален правильно (число A теперь меньше, чем до удаления). Однако число B остается неизменным. Таким образом, кажется, что правило удаления "Каскад" не соблюдается.

Я знаю, что могу вручную переходить через отношения A → B и вручную удалять каждый B. Однако похоже, что это то, что Core Data предоставляет бесплатно, поэтому я не хочу этого делать, если Core Data не будет недостаточно. Любая информация об использовании правил удаления "Каскад" приветствуется.

Ответы

Ответ 2

Основываясь на

Любые связи, принадлежащие C, ассоциированные с B, были удалены, также удаляются Предполагает, что B-C также должен иметь Cascade.

Кроме того, если B удален, то C также следует удалить. Снова Каскад.

  • Nullify часто используется в качестве правила обратного удаления *

т. Отношение Bs к A равно Nullify. C к B - Nulllify. Таким образом, когда C удаляется, B НЕ удаляется. И когда B удаляется; A НЕ удаляется.

Как и в этом выигрышном рисунке.

A --- → B Каскад  < ---- Nullify

B --- → C Cascade  < ---- Nullify