Удаления в структуре «многие ко многим» - PullRequest
21 голосов
/ 19 февраля 2011

Я просто хочу проверить очень быстро. Скажем, у меня есть две сущности в модели данных: каталог и продукт. Они имеют отношения «многие ко многим» друг с другом, и оба требуются (каталог должен иметь хотя бы один продукт, а все продукты должны принадлежать как минимум одному каталогу). Так что, если я должен был удалить Продукт, его удаление, конечно, должно быть Нулевым.

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

Ответы [ 3 ]

23 голосов
/ 19 февраля 2011

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

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

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

13 голосов
/ 19 июля 2012

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

- (void)willSave
{
    [super willSave];

    if (self.isDeleted)
        return;

    if (self.products.count == 0)
        [self.managedObjectContext deleteObject:self];
}
1 голос
/ 14 октября 2015

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

override func willSave() {
    super.willSave()

    if self.deleted {
      return
    }

    if self.products.count == 0 {
      self.managedObjectContext?.deleteObject(self)
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...