2013-07-29 14 views
16

Come ho capito, se elimino una riga genitore, i suoi figli dovrebbero essere cancellati se accendo la cascata su delete. Tuttavia, dai miei test, non sembra funzionare affatto. Non importa se imposto WillCascaseOnDelete su true o false, semplicemente imposta la chiave esterna dei suoi figli su null. Questo sta causando un altro problema che devo impostare la chiave esterna nullable, altrimenti, SaveChange genererà un'eccezione. È un difetto o un comportamento desiderato?Come funziona WillCascadeOnDelete in Entity Framework?

risposta

12

Questo perché le chiavi esterne (figlio) sono annullabili. Per impostazione predefinita, quando si elimina il genitore, se la chiave esterna della relazione è nullable, EF cancella il genitore e imposta la chiave esterna su null. Se la chiave esterna NON è NULL, eliminerà il bambino (il comportamento che stai cercando?).

È possibile modificare questo comportamento predefinito here

+3

Sto riscontrando lo stesso problema, la mia chiave esterna è impostata come 'IsRequired();', la relazione ha '.WillCascadeOnDelete (true)' ma ottengo comunque un'eccezione quando provo a eliminare l'oggetto genitore. –

+0

@UwConcept, mi aspetto che venga generata un'eccezione se è stata specificata la relazione di chiave esterna come 'IsRequired();' poiché Entity Framework non può impostare il valore su 'null' dopo la rimozione dell'oggetto padre. – weenoid

+3

@weenoid Grazie per la risposta. Ma non avrebbe più senso eliminare quindi l'oggetto figlio invece di impostare un valore NULL in un campo non annullabile? Solo i miei due centesimi. –

0

Assicurarsi che nella finestra di chiave esterna di relazione in SQL Server, è stata selezionata come regola Cascade Delete.