문제

부서와 직원이 있고 각 부서에는 여러 직원이 있지만 각 직원은 여러 부서의 일부가 될 수 있습니다.

따라서 직원과 부서 간에는 다수의 관계가 있습니다. 부서를 삭제할 때 해당 부서의 일부인 모든 직원을 삭제하고 다른 부서의 구성원 인 모든 직원에 대해이 부서와의 관계를 무효화하고 싶습니다.

양방향으로 캐스케이드 규칙이 그렇게할까요? 아니면 캐스케이드 규칙이 다른 제휴 관계에 관계없이 부서의 모든 직원을 자동으로 삭제합니까?

도움이 되었습니까?

해결책

캐스케이드 규칙은 대상의 객체를 자동으로 삭제합니다. 따라서 부서를 삭제하면 직원이 부서 수에 관계없이 삭제됩니다.

"고아"직원, 즉 부서가없는 직원 만 삭제하는 것이 조금 더 미묘한 것으로 들립니다. 부서를 삭제하면 부서를 찾는 좋은 방법은 다음과 같은 일을하는 것입니다.

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

다른 팁

고마워요, 알렉스. 아마 그렇게 할 것입니다. 그 동안 나는 이것을하는 다른 방법을 찾았습니다.

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

그것은 또한 잘 작동하지만 이런 종류의 행동을 관찰 할 여러 가지 엔티티가 있다면 더 복잡해 질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top