Pergunta

Eu tenho um modelo de dados principal que tem três entidades: A, B e C. A tem um relacionamento individual com B, e B tem um relacionamento de muitos para muitos com C. A regra de exclusão para A-> B é "Cascade" e B -> A "Sem ação". A regra de exclusão para B -> C é "sem ação", e C -> B é "negar".

Estou tendo problemas para realizar uma exclusão sobre a entidade A. O que eu quero acontecer é o seguinte:

  1. Eu excluo uma instância de um (usando deleteObject:)
  2. O delete se propaga a qualquer B associado a um (devido à regra de exclusão de "cascata")
  3. Todos os B associados a A são excluídos
  4. Quaisquer relacionamentos pertencentes a C's cujos B associados foram excluídos, também são removidos

Isso pode ser um pouco confuso, então deixe -me parafrasear: quando um A é excluído, exclua todos os B associados. E quaisquer C que referenciem esses B não devem mais referenciá -los.

Nos meus testes, não estou vendo o "cascata" excluir o trabalho de regra para mim. Quando eu excluo um A, eu invoco processPendingChanges Imediatamente depois (apenas para garantir que a exclusão tenha sido feita). Em seguida, comparo o número de A e B que estavam no NSmanAgedObjectContext antes da exclusão e depois dela. A instância de A foi devidamente excluída (o número de A's totais agora é um menor que antes da exclusão). No entanto, o número de B permanece o mesmo. Então, parece que a regra de exclusão de "cascata" não está sendo homenageada.

Sei que posso passar manualmente pelo relacionamento A -> B e excluir manualmente cada um B. No entanto, parece que isso é algo que os dados principais fornecem gratuitamente, por isso não quero fazer isso, a menos que os dados principais sejam insuficientes. Qualquer informação sobre o uso de regras de exclusão de "cascata" é bem -vinda.

Foi útil?

Solução

Certamente não sou especialista em dados essenciais, mas lendo o Documentação sobre as várias opções de regra de exclusão, parece -me que você quer que o relacionamento B -> C seja Anular, ao invés de Nenhuma ação. Talvez o BS não esteja indo embora porque o CS ainda está mantendo referências a eles?

Outras dicas

Com base no

Quaisquer relações pertencentes a C cujos B associados foram excluídos também são removidos sugere que o BC também deve ter cascata.

Além disso, se B for removido, os C também deverão ser excluídos. Novamente Cascade.

  • A nulidade é frequentemente usada como uma regra de exclusão inversa*

ou seja. O relacionamento BS com A é anulado. C Relação com B é nulllify. De modo que quando C é excluído, B não é excluído. E quando B é excluído; A não é excluído.

Como neste desenho vencedor.

A --- >> B CASCADE <---- NULLIFY

B --- >> C Cascade <---- Nullify

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top