核心数据级联不删除关系

时间:2015-11-14 15:03:46

标签: core-data

我有一个账单实体,其中包含与billingdetails实体的多对多关系。 see the model

Bill.billingdetails上的删除规则是Cascade,billingdetails不是可选的。 BillingDetails.bill上的删除规则是Nullify,bill也不是可选的。

现在,当我删除帐单时,它会被删除,但相关的billingdetails不会被删除。他们甚至没有碰过。我将一条日志消息放入BillingDetails prepareForDeletion方法,并且不调用该方法。 我为BillingDetails写的唯一方法是:

@implementation BillingDetails

// Custom logic goes here.
- (void)copyFromSession:(Session *)session {
    self.session_date = session.date;
    self.session_duration = session.duration;
    self.session_factor = session.factor;
    self.session_goaecode = session.treatment.goaecode;
    self.session_unitprice = session.treatment.price;
    if ([self.bill.patient.language isEqualToString:@"English"]) {
        self.session_treatment = session.treatment.descriptionEnglish;
    }
    if ([self.bill.patient.language isEqualToString:@"German"]) {
        self.session_treatment = session.treatment.descriptionGerman;
    }
}

@end

这是我正在使用的测试,它在第二个断言(约为BillingDetails)时始终失败: (sut在此上下文中是Bill正在测试中)

- (void)testBillDeleteDeletesAllBillingdetails {
    NSString *markMeString = @"Find me if you can";
    NSDate   *markMeDate   = [NSDate dateWithTimeIntervalSince1970:0];
    [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
        for (BillingDetails *billingdetails in sut.billingdetails) {
            billingdetails.session_treatment = markMeString;
        }
        sut.date = markMeDate;
        [sut MR_deleteEntity];
    }];
    XCTAssertNil([Bill MR_findFirstByAttribute:@"date" withValue:markMeDate]);
    XCTAssertEqual([BillingDetails MR_findByAttribute:@"session_treatment" withValue:markMeString].count, 0);

}

我确实使用它来解决这个问题,并且它有效。

@implementation Bill

// Custom logic goes here.

… omitted to shorten …

- (void)prepareForDeletion {
    for (BillingDetails *bd in self.billingdetails) {
        [bd MR_deleteEntity];
    }
}

@end

但我认为这不是真正的方法。

我不知道在哪里寻找问题了。我没有看到任何可能会干扰的依赖项。 任何帮助都非常感谢。感谢

2 个答案:

答案 0 :(得分:0)

很可能你没有保存更改。如果您在主要上下文中删除了Bill,它将不再显示在您的UI中,但在保存之前不会删除任何内容。

答案 1 :(得分:0)

在尝试使用我自己的代码模拟删除规则后,我意识到导致级联失败的原因。

我的bill也有patient关系。设置完毕后,billingdetails填充了来自sessions的未开票patient。在实际添加billingdetails之前,billingdetails属性已重置为nil。

这引起了连锁反应。 删除bill,首先使patient关系无效。通过将patient属性设置为nil,billingdetails无效,并且级联机制无法再找到它。 但当然,我已经将结算明细浮动了。 这是我的错。很抱歉打扰了。