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.) 変更が発生し、従業員が更新されたとき。そのオブジェクトに部門との関係がないかどうかを確認し、削除します。

- (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 に答える