เอกสารประกอบของ Apple มีตัวอย่างที่ดีที่แนะนำสถานการณ์ที่คุณอาจมีปัญหาโดยไม่มีความสัมพันธ์แบบผกผัน ลองแมปลงในกรณีนี้
สมมติว่าคุณสร้างแบบจำลองดังต่อไปนี้:
หมายเหตุคุณมีต่อหนึ่งความสัมพันธ์ที่เรียกว่า " ประเภท " จากไปSocialApp
SocialAppType
ความสัมพันธ์คือไม่เลือกและมี"ปฏิเสธ" กฎลบ
ตอนนี้ให้พิจารณาสิ่งต่อไปนี้:
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];
สิ่งที่เราคาดว่าจะล้มเหลวในการบันทึกบริบทนี้เนื่องจากเราได้ตั้งกฎการลบเป็นปฏิเสธในขณะที่ความสัมพันธ์นั้นไม่จำเป็น
แต่ที่นี่การบันทึกสำเร็จ
เหตุผลก็คือว่าเราไม่ได้ตั้งค่าความสัมพันธ์แบบผกผัน ด้วยเหตุนั้นอินสแตนซ์ของ SocialApp จึงไม่ได้รับการทำเครื่องหมายว่ามีการเปลี่ยนแปลงเมื่อลบ appType ดังนั้นจึงไม่มีการตรวจสอบความถูกต้องเกิดขึ้นสำหรับ socialApp ก่อนการบันทึก (มันไม่จำเป็นต้องทำการตรวจสอบความถูกต้องเนื่องจากไม่มีการเปลี่ยนแปลงเกิดขึ้น) แต่จริงๆแล้วมีการเปลี่ยนแปลงเกิดขึ้น แต่มันก็ไม่ได้สะท้อนออกมา
ถ้าเราจำ appType โดย
SocialAppType *appType = [socialApp socialAppType];
appType ไม่มีศูนย์
แปลกใช่มั้ย เราได้รับศูนย์สำหรับแอตทริบิวต์ที่ไม่ใช่ตัวเลือก?
ดังนั้นคุณจะไม่มีปัญหาหากคุณตั้งค่าความสัมพันธ์แบบผกผัน มิฉะนั้นคุณต้องทำการบังคับให้มีการตรวจสอบโดยการเขียนรหัสดังนี้
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];