Search code examples
objective-ccocoadatabase-designcore-datarelationships

Core Data Deletion rules and many-to-many relationships


Say you have departments and employees and each department has several employees, but each employee can also be part of several departments.

So there is a many-to-many relationship between employees and departments. When deleting a department I would like to delete all employees that are only part of that department and nullify the relationship to this department for all employees that are also member of another department.

Would a cascade-rule in both directions do that? Or does a cascade rule automatically delete all employees of a department regardless of other affiliations?


Solution

  • A cascade rule will automatically delete the objects at the destination. So, if you delete a department, the employees will be deleted regardless of the number of departments they're in.

    It sounds like the behavior you want is a little more nuanced, to delete only the "orphaned" employees -- i.e. those that don't have a department. When you delete a department, a good way of finding those would be to do something like this:

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