Domanda

Supponi di avere dipartimenti e dipendenti e che ogni dipartimento abbia diversi dipendenti, ma ogni dipendente può anche far parte di più dipartimenti.

Quindi esiste una relazione molti-a-molti tra dipendenti e dipartimenti. Quando si elimina un reparto, desidero eliminare tutti i dipendenti che fanno solo parte di quel reparto e annullare la relazione con questo dipartimento per tutti i dipendenti che sono anche membri di un altro dipartimento.

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

È stato utile?

Soluzione

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

Sembra che il comportamento che desideri sia un po 'più sfumato, per eliminare solo il " orfano " impiegati - 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:@"departments.@count == 1"]];
for (NSManagedObject *orphanedEmployee in orphanedEmployees) {
    [managedObjectContext deleteObject:orphanedEmployee];
}    

[managedObjectContext deleteObject:doomedDepartment];

Altri suggerimenti

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

1.) registrati per le notifiche sulle modifiche:

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

2.) quando si verificano cambiamenti e un dipendente viene aggiornato. Controllo se quell'oggetto ha 0 relazioni con i dipartimenti e lo cancello:

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

Anche questo funziona bene, ma potrebbe diventare più complicato se si hanno diverse entità per le quali osservare questo tipo di comportamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top