11

假设您有部门和员工,每个部门都有几个员工,但每个员工也可以是多个部门的一部分。

所以员工和部门之间是多对多的关系。删除部门时,我想删除仅属于该部门的所有员工,并取消所有同时属于另一个部门的员工与该部门的关系。

双向的级联规则会这样做吗?或者级联规则是否会自动删除一个部门的所有员工,而不考虑其他从属关系?

4

2 回答 2

21

级联规则将自动删除目的地的对象。因此,如果您删除一个部门,无论他们所在的部门数量如何,员工都将被删除。

听起来你想要的行为有点微妙,只删除“孤立”员工——即那些没有部门的员工。当您删除一个部门时,找到这些部门的一个好方法是执行以下操作:

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];
于 2009-10-23T14:14:14.107 回答
5

谢谢,亚历克斯。我可能会这样做。与此同时,我发现了另一种方法:

1.) 注册更改通知:

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

2.) 当发生变化并且员工得到更新时。我检查该对象是否与部门有 0 关系并将其删除:

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

这也很有效,但如果您有几个不同的实体来观察这种行为,可能会变得更加复杂。

于 2009-10-26T12:35:39.747 回答