Tài liệu của Apple có một ví dụ tuyệt vời cho thấy một tình huống mà bạn có thể gặp vấn đề bằng cách không có mối quan hệ nghịch đảo. Hãy ánh xạ nó vào trường hợp này.
Giả sử bạn mô hình hóa nó như sau:
Lưu ý rằng bạn có mối quan hệ một-một gọi là " loại ", từ SocialApp
đến SocialAppType
. Mối quan hệ là không tùy chọn và có quy tắc xóa "từ chối" .
Bây giờ hãy xem xét những điều sau đây:
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];
Những gì chúng tôi mong đợi là thất bại trong việc lưu bối cảnh này vì chúng tôi đã đặt quy tắc xóa là Từ chối trong khi mối quan hệ là không bắt buộc.
Nhưng ở đây tiết kiệm thành công.
Lý do là chúng tôi chưa thiết lập mối quan hệ nghịch đảo . Do đó, cá thể ứng dụng xã hội không được đánh dấu là đã thay đổi khi appType bị xóa. Vì vậy, không có xác nhận nào xảy ra cho SocialApp trước khi lưu (nó cho rằng không cần xác thực vì không có thay đổi nào xảy ra). Nhưng thực sự là một sự thay đổi đã xảy ra. Nhưng nó không được phản ánh.
Nếu chúng tôi nhớ lại appType bởi
SocialAppType *appType = [socialApp socialAppType];
Loại ứng dụng là không.
Thật lạ phải không? Chúng tôi nhận được không cho một thuộc tính không tùy chọn?
Vì vậy, bạn sẽ không gặp rắc rối nếu bạn đã thiết lập mối quan hệ nghịch đảo. Nếu không, bạn phải thực hiện xác nhận bằng cách viết mã như sau.
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
[socialApp setValue:nil forKey:@"socialAppType"]
BOOL saved = [managedObjectContext save:&error];