21

早く確認したいだけです。データ モデルにカタログと製品の 2 つのエンティティがあるとします。相互に多対多の関係があり、両方が必要です (カタログには少なくとも 1 つの製品が必要であり、すべての製品はそれぞれ少なくとも 1 つのカタログに属している必要があります)。したがって、製品を削除する場合、その削除はもちろん無効にする必要があります。

しかし、カタログの削除ポリシーはどうあるべきでしょうか? カタログが削除された場合、必ずしもすべての製品がカタログに排他的に属するわけではありません。製品は、複数のカタログに属する場合があります。したがって、カスケードは絶対に使用しないでください。しかし、Nullify で十分でしょうか? カタログに属さない製品がぶら下がっている場合はどうすればよいですか? Core Data には、多対多スキーマでこの問題を解決するために何が組み込まれていますか? スキーマを変更する必要がありますか?

4

3 に答える 3

23

Nullifyで十分であり、多対多の音が正しく聞こえます。ただし、必要な特定の制約(孤立を削除する)はコアデータによって直接強制することはできないため、自分で少しクリーンアップする必要があります。

具体的にwillSaveは、エンティティクラスに実装し、各エンティティをテストします。削除されていませんか。また、関連する(製品/カタログ)はありませんか?もしそうなら、自分自身を削除します。(sの無限ループを回避するには、削除されていないテストが重要willSaveです。)

これにより、時間が節約されるまで、孤立したカタログまたは製品の削除が延期されます。これはおそらく問題ではありません。

于 2011-02-19T06:44:46.490 に答える
13

私はrgeorgeの答えを実装し、正確なコードが他の人に役立つかもしれないと思いました:

- (void)willSave
{
    [super willSave];

    if (self.isDeleted)
        return;

    if (self.products.count == 0)
        [self.managedObjectContext deleteObject:self];
}
于 2012-07-18T20:30:07.173 に答える
1

Andy と JosephH の迅速な翻訳

override func willSave() {
    super.willSave()

    if self.deleted {
      return
    }

    if self.products.count == 0 {
      self.managedObjectContext?.deleteObject(self)
    }
  }
于 2015-10-14T17:20:22.380 に答える