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.
C'est génial, merci Marcus. –