2009-10-23 7 views
11

Supposons que vous ayez des départements et des employés et que chaque département compte plusieurs employés, mais que chaque employé puisse également faire partie de plusieurs départements.Données de base Règles de suppression et relations plusieurs-à-plusieurs

Il existe donc une relation plusieurs-à-plusieurs entre employés et départements. Lorsque je supprime un service, j'aimerais supprimer tous les employés qui ne font partie que de ce ministère et annuler la relation avec ce service pour tous les employés qui sont également membres d'un autre ministère.

Est-ce qu'une règle en cascade dans les deux sens ferait cela? Ou une règle en cascade supprime-t-elle automatiquement tous les employés d'un département, indépendamment des autres affiliations?

Répondre

21

Une règle en cascade supprimera automatiquement les objets à la destination. Donc, si vous supprimez un département, les employés seront supprimés quel que soit le nombre de départements dans lesquels ils se trouvent.

Il semble que le comportement souhaité soit un peu plus nuancé, pour supprimer uniquement les employés "orphelins" - - c'est-à-dire ceux qui n'ont pas de département. Lorsque vous supprimez un département, un bon moyen de trouver ceux-ci serait de faire quelque chose comme ceci:

NSManagedObject *doomedDepartment = // get the department to be deleted 

NSSet *employees = [doomedDepartment valueForKey:@"employees"]; 
NSSet *orphanedEmployees = [employees filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 1"]]; 
for (NSManagedObject *orphanedEmployee in orphanedEmployees) { 
    [managedObjectContext deleteObject:orphanedEmployee]; 
}  

[managedObjectContext deleteObject:doomedDepartment]; 
5

Merci, alex. Je vais probablement faire ça. En attendant, j'avais trouvé une autre façon de le faire:

1.) enregistrer les notifications sur les changements:

[[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(managedObjectContextDidChange:) 
      name:NSManagedObjectContextObjectsDidChangeNotification 
      object:managedObjectContext]; 

2.) lorsque des changements se produisent et un employé est mis à jour. Je vérifier si cet objet a 0 relations avec les départements et supprimer:

- (void)managedObjectContextDidChange:(NSNotification *)notification { 
    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey]; 

for(NSManagedObject *obj in updatedObjects){   
    // walk through updated objects -> check for employees 
    // check if they still contain departments and if not delete them 
    if([obj.entity.name isEqualToString:@"Employee"]){ 
     NSLog(@"Employee changed!"); 
     if([[(Employee*)obj Departments] count]==0){ 
      NSLog(@"No more relations -> Delete Employee"); 
      [managedObjectContext deleteObject:obj]; 
     } 
    } 
}} 

Cela fonctionne bien aussi, mais peut-être obtenir plus compliqué si vous avez plusieurs entités différentes pour lesquelles d'observer ce genre de comportement.

+4

Si vous travaillez sur Cocoa Touch ou Snow Leopard, vous pouvez mettre cette logique dans la méthode '-prepareForDeletion' du département. –

+0

Je pense que c'est une meilleure solution, merci! – Nick

+0

Quand vous dites département, voulez-vous dire un département d'appel NSManagedObject? – Ricardo

Questions connexes