La documentación de Apple tiene un gran ejemplo que sugiere una situación en la que podría tener problemas al no tener una relación inversa. Vamos a mapearlo en este caso.
Suponga que lo modeló de la siguiente manera:
Tenga en cuenta que tiene una relación uno a uno llamada " tipo ", de SocialApp
a SocialAppType
. La relación no es opcional y tiene una regla de eliminación "denegar" .
Ahora considere lo siguiente:
SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated
[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];
Lo que esperamos es fallar este contexto, ya que hemos establecido la regla de eliminación como Denegar, mientras que la relación no es opcional.
Pero aquí la salvación tiene éxito.
La razón es que no hemos establecido una relación inversa . Debido a eso, la instancia de socialApp no se marca como modificada cuando se elimina appType. Por lo tanto, no se realiza ninguna validación para socialApp antes de guardar (se supone que no se necesita validación ya que no ocurrió ningún cambio). Pero en realidad ocurrió un cambio. Pero no se refleja.
Si recordamos appType por
SocialAppType *appType = [socialApp socialAppType];
appType es nulo.
Extraño, ¿no es así? ¿Obtenemos nil para un atributo no opcional?
Por lo tanto, no tiene problemas si ha establecido la relación inversa. De lo contrario, debe forzar la validación escribiendo el código de la siguiente manera.
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];