我有一个账单实体,其中包含与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
但我认为这不是真正的方法。
我不知道在哪里寻找问题了。我没有看到任何可能会干扰的依赖项。 任何帮助都非常感谢。感谢
答案 0 :(得分:0)
很可能你没有保存更改。如果您在主要上下文中删除了Bill
,它将不再显示在您的UI中,但在保存之前不会删除任何内容。
答案 1 :(得分:0)
在尝试使用我自己的代码模拟删除规则后,我意识到导致级联失败的原因。
我的bill
也有patient
关系。设置完毕后,billingdetails
填充了来自sessions
的未开票patient
。在实际添加billingdetails
之前,billingdetails
属性已重置为nil。
这引起了连锁反应。
删除bill
,首先使patient
关系无效。通过将patient
属性设置为nil,billingdetails
无效,并且级联机制无法再找到它。
但当然,我已经将结算明细浮动了。
这是我的错。很抱歉打扰了。