2012-11-02 11 views
6

Sto cercando di creare una relazione molti-a-molti tra la stessa tabella in SQL Server.Eliminazione a cascata su molti a molti tra la stessa tabella

Ho un tavolo Object con colonne ObjectId e Name.

Il rapporto segue queste regole:

  • un bambino può avere molti genitori
  • un genitore può avere molti figli
  • Objecta può essere un bambino di ObjectB e ObjectB può essere figlio di Objecta
  • ma un oggetto non può essere un figlio diretto di se stesso

Così ho creare una seconda tabella ObjectRelation con colonne ParentId e ChildId e ovviamente voglio che queste relazioni siano eliminate a cascata.

Ma quando provo questo in SQL Server ottengo l'errore

Introducendo FOREIGN KEY vincolo 'FK_ObjectRelation_Object1' sul tavolo 'tblADMembership' potrebbe causare cicli o più percorsi a cascata. Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION o modificare altri vincoli FOREIGN KEY.

In SQL Server Compact ottengo

Il rapporto referenziale si tradurrà in un riferimento ciclico che non è consentito.

Ho fatto qualche ricerca e ho capito perchè ricevo questi errori, ma c'è un modo per aggirare questo che sarà anche lavorare su SQL Server Compact (quindi niente stored procedure)? O c'è un modo migliore per modellare questa relazione?

risposta

2

Mi sono imbattuto in un problema simile me stesso .... Ho finito per rimuovere la chiave esterna. La logica di cancellazione ciclica è stata trasferita al codice.

0

Ho avuto un problema simile con un treeview. Questo è un codice per eliminare che è stato utile per me: (I salvare l'ID nella proprietà di valore e sto usando un modello di entità inquadramento eliminare) Forse può aiutare qualcuno

private void removeRecursive(TreeNode parentToDelete) 
    { 
     foreach (TreeNode tn in parentToDelete.ChildNodes) 
      removeRecursive(tn); 

     long id = long.Parse(parentToDelete.Value); 
     Category deleteCat = context.Categories.Single(x => x.Id ==id); 
     context.Categories.DeleteObject(deleteCat); 
    } 

PD dispiace per il mio inglese è orribile ...