proyectos ejemplos core-data many-to-many cascade data-integrity

core-data - ejemplos - django



Supresiones en una estructura de muchos a muchos (3)

Anular es suficiente y suena de muchos a muchos. Sin embargo, la restricción específica que desea (eliminar huérfanos) no es directamente exigible por los datos centrales, por lo que puede hacer una pequeña limpieza usted mismo.

Específicamente, implemente willSave en sus clases de entidad, y willSave que cada entidad pruebe: ¿no soy eliminado? y, ¿no tengo asociado (productos / catálogos)? Si es así, elimíname. (la prueba no eliminada es importante para evitar un bucle infinito de willSave s).

Esto pospone la eliminación de los productos o los catálogos huérfanos hasta que se ahorre tiempo. Esto probablemente no es un problema.

Solo quiero comprobar muy rápido. Supongamos que tengo dos entidades en un modelo de datos: Catálogo y Producto. Tienen una relación muchos a muchos entre sí, y ambos son obligatorios (un Catálogo debe tener al menos un Producto, y todos los Productos deben pertenecer, al menos, a un Catálogo). Entonces, si tuviera que eliminar un Producto, su eliminación debería ser Anular, por supuesto.

Pero, ¿cuál debería ser la política de eliminación para Catalog? Si se elimina un Catálogo, no todos sus Productos necesariamente pertenecen exclusivamente a él. Un producto puede pertenecer a más de un catálogo. Entonces definitivamente no debería usar Cascade. Sin embargo, ¿es suficiente anular? ¿Qué sucede si termino colgando productos que no pertenecen a un catálogo? ¿Qué ha incorporado Core Data que resuelva este problema con esquemas de muchos a muchos? ¿Debo modificar mi esquema?


Implementé la respuesta de rgeorge y pensé que el código exacto podría ser útil para otras personas:

- (void)willSave { [super willSave]; if (self.isDeleted) return; if (self.products.count == 0) [self.managedObjectContext deleteObject:self]; }


Swift traducción de Andy y JosephH

override func willSave() { super.willSave() if self.deleted { return } if self.products.count == 0 { self.managedObjectContext?.deleteObject(self) } }