Question

Supposons que vous ayez des départements et des employés et que chaque service compte plusieurs employés, mais que chaque employé peut également faire partie de plusieurs départements.

Il existe donc une relation multiple entre employés et départements. Lors de la suppression d'un service, je souhaite supprimer tous les employés ne faisant partie que de ce service et annuler la relation avec ce service pour tous les employés également membres d'un autre service.

Est-ce qu'une règle de cascade dans les deux sens ferait cela? Ou bien une règle de cascade supprime-t-elle automatiquement tous les employés d’un service, quelles que soient les autres affiliations?

Était-ce utile?

La solution

Une règle de cascade supprimera automatiquement les objets de 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é: vous ne supprimez que le mot "orphelin". employés - c’est-à-dire ceux qui n’ont pas de département. Lorsque vous supprimez un département, vous pouvez le faire de la manière suivante:

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

Autres conseils

Merci, alex. Je vais probablement le faire. Entre temps, j'avais trouvé une façon différente de le faire:

1.) inscrivez-vous pour recevoir des notifications sur les modifications:

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

2.) lorsque des changements se produisent et qu'un employé est mis à jour. Je vérifie si cet objet a 0 relation avec les départements et le supprime:

- (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 pourrait devenir plus compliqué si vous avez plusieurs entités pour lesquelles observer ce type de comportement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top