Подтвердить что ты не робот

Удаления во многих структурах

Я просто хочу проверить действительно быстро. Скажем, у меня есть два объекта в модели данных: Каталог и Продукт. Они имеют отношения "многие ко многим" друг с другом, и оба они требуются (у Каталога должен быть хотя бы один Продукт, и все Продукты должны принадлежать хотя бы одному Каталогу). Поэтому, если я должен удалить Продукт, его удаление должно быть Nullify, конечно.

Но какова должна быть политика удаления для Каталога? Если каталог удален, не все его Продукты обязательно принадлежат исключительно ему. Продукт может принадлежать более чем одному Каталогу. Поэтому я определенно не должен использовать Cascade. Однако достаточно ли Nullify? Что делать, если я заканчиваю болтающимися продуктами, которые не принадлежат Каталогу? Что построил Core Data, который разрешил бы эту проблему со схемами "многие ко многим"? Мне нужно изменить мою схему?

4b9b3361

Ответ 1

Nullify достаточно, и многие-ко-многим звучат правильно. Конкретное ограничение, которое вы хотите (удаление сирот), напрямую не может быть осуществлено по основным данным, поэтому вы можете немного почистить себя.

В частности, реализуйте willSave в своих классах сущностей и проверяйте каждый объект: я не удаляюсь; и у меня нет связанных (продуктов/каталогов)? Если да, удалите себя. (тест, не удаленный, является важным, чтобы избежать бесконечного цикла willSave s.)

Это откладывает удаление сиротских каталогов или продуктов до экономии времени. Это, вероятно, не проблема.

Ответ 2

Я применил ответ rgeorge и подумал, что точный код может быть полезен другим людям:

- (void)willSave
{
    [super willSave];

    if (self.isDeleted)
        return;

    if (self.products.count == 0)
        [self.managedObjectContext deleteObject:self];
}

Ответ 3

Быстрый перевод Энди и Джозефа Х.

override func willSave() {
    super.willSave()

    if self.deleted {
      return
    }

    if self.products.count == 0 {
      self.managedObjectContext?.deleteObject(self)
    }
  }