2009-10-23 13 views
11

Supponiamo di avere reparti e dipendenti e ogni reparto ha diversi dipendenti, ma ogni dipendente può anche far parte di diversi reparti.Regole di cancellazione dei dati principali e relazioni molti-a-molti

Quindi c'è una relazione molti-a-molti tra dipendenti e reparti. Quando si elimina un dipartimento, desidero eliminare tutti i dipendenti che fanno parte di quel reparto e annullare il rapporto con questo reparto per tutti i dipendenti che sono anche membri di un altro reparto.

Una regola a cascata in entrambe le direzioni lo farebbe? Oppure una regola a cascata elimina automaticamente tutti i dipendenti di un dipartimento indipendentemente dalle altre affiliazioni?

risposta

21

Una regola a cascata eliminerà automaticamente gli oggetti nella destinazione. Quindi, se elimini un dipartimento, i dipendenti verranno eliminati indipendentemente dal numero di reparti in cui si trovano.

Sembra che il comportamento che desideri sia un po 'più sfumato, per eliminare solo i dipendenti "orfani" - - cioè quelli che non hanno un dipartimento. Quando elimini un dipartimento, un buon modo per trovarli sarebbe fare qualcosa del genere:

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

Grazie, alex. Probabilmente lo farò. Nel frattempo avevo trovato un modo diverso di fare questo:

1.) Non sei registrato per le notifiche sulle modifiche:

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

2.) in caso di cambiamenti e un dipendente viene aggiornato. Mi controllare se quell'oggetto ha 0 relazioni ai reparti ed eliminarlo:

- (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]; 
     } 
    } 
}} 

che funziona bene anche, ma potrebbe ottenere più complicato se si dispone di diverse entità diverse per cui osservare questo tipo di comportamento.

+4

Se si sta lavorando su Cocoa Touch o Snow Leopard, è possibile inserire questa logica nel metodo '-prepareForDeletion' del dipartimento. –

+0

penso che questa sia una soluzione migliore, grazie! – Nick

+0

Quando si dice dipartimento, si intende un reparto chiamate NSManagedObject? – Ricardo

Problemi correlati