1

J'ai un magasin de données de base qui contient un certain nombre d'entités MediaItem qui décrivent, bien, des éléments de médias. J'ai aussi des NewsItems, qui ont des relations un-à-plusieurs avec un certain nombre de MediaItems. Jusqu'ici tout va bien.Maintien de l'intégrité des entités de données principales avec de nombreuses relations un-à-plusieurs entrantes

Cependant, j'ai aussi PlayerItems et GalleryItems qui ont aussi des relations un-à-plusieurs avec MediaItems. Les MediaItems sont donc partagés entre les entités. Etant donné que de nombreuses entités peuvent avoir des relations un-à-plusieurs, comment puis-je établir des relations réciproques d'un MediaItem à toutes (1 ou plusieurs) des entités qui ont des relations avec lui et comment puis-je implémenter règles pour supprimer MediaItems lorsque le nombre de ces relations réciproques tombe à 0?


Pour l'enregistrement (et dans le cas où il se avère utile à quelqu'un d'autre), je résolu ce problème en créant une classe abstraite MediaLinkedEntity avec un à-plusieurs à MediaItems (nommé MediaItems à la fin MediaLinkedEntity et LinkedEntities à l'extrémité). Je puis cette entité pour sous-classé NewsItems et GalleryItems et mis en œuvre la méthode -prepareForDeletion suivante MediaLinkedEntity:

- (void)prepareForDeletion { 

    NSSet *mediaItems = self.MediaItems; 
    NSSet *linkedEntities; 

    // step through all media items we link to 
    for(MediaItem *mediaItem in mediaItems){ 
     linkedEntities = mediaItem.LinkedEntities; 
     if([ linkedEntities count ] == 1 && [ linkedEntities containsObject: self ]){ 
     // if this MediaLinkedEntity is the only entry in the mediaItem's linked entities list, delete it. 
      [ mediaItem.managedObjectContext deleteObject: mediaItem ]; 
     } 
    } 

    [ super prepareForDeletion ]; 
} 

Essentiellement, après la réponse de Marcus ci-dessous.

Répondre

1

La meilleure réponse à cela est d'avoir une entité parente abstraite qui gère la relation de manière générique. Cela vous permettra de réduire le nombre de relations dans votre modèle. En ce qui concerne la règle de suppression, vous devez créer une sous-classe pour le côté «un» des relations et implémenter leur méthode -prepareForDeletion pour vérifier les éléments orphelins de tous les côtés, puis les supprimer lorsqu'elle se produit.

+0

C'est génial, merci Marcus. –

0

Cependant, j'ai aussi PlayerItems et GalleryItems qui ont aussi des relations un-à-plusieurs avec MediaItems. Les MediaItems sont donc partagés entre les entités.

La méthode la plus simple mais pas très belle serait de créer des relations inverses pour chacune des relations MediaItem.

Une autre possibilité serait de créer une entité parente abstraite ayant une relation avec MediaItem et d'hériter de GalleryItem, NewsItems, PlayerItem de cette entité générale.

Étant donné que de nombreuses entités peuvent avoir comment puis-je établir des relations réciproques d'un MediaItem à tous (1 ou plus) des entités qui possèdent des relations et, un à-plusieurs, en outre, comment Je implémente des règles pour supprimer MediaItems lorsque le nombre de ces relations réciproques tombe à 0?

Il existe plusieurs façons de créer ce comportement. Vous pouvez utiliser KVO pour observer toutes les relations inverses de MediaItem