2013-07-29 12 views
16

Jak rozumiem, jeśli usunę wiersz nadrzędny, jego dzieci powinny zostać usunięte, jeśli włączę kaskadę podczas usuwania. Jednak z moich testów to w ogóle nie działa. Nieważne, czy ustawię WillCascaseOnDelete na wartość true lub false, po prostu ustawi obcy klucz swoich dzieci na wartość null. Powoduje to inny problem, który muszę ustawić zerowy klucz obcy, w przeciwnym razie SaveChange rzuci wyjątek. Czy jest to wada lub pożądane zachowanie?Jak działa WillCascadeOnDelete w Entity Framework?

Odpowiedz

12

Dzieje się tak, ponieważ klucze obce (dziecko) są zerowe. Domyślnie podczas usuwania elementu nadrzędnego, jeśli klucz obcy w relacji jest zerowalny EF usunie element nadrzędny i ustawi klucz obcy na wartość null. Jeśli klucz obcy NIE JEST NULL, usunie dziecko (zachowanie, którego szukasz?).

Możesz zmienić to domyślne zachowanie here

+3

Występuje ten sam problem, mój klucz obcy jest ustawiony jako 'IsRequired();', relacja ma wartość '.WillCascadeOnDelete (true)', ale nadal otrzymuję wyjątek podczas próby usunięcia obiektu nadrzędnego. –

+0

@UwConcept, Spodziewam się, że wyjątek zostanie zgłoszony, jeśli określisz relację klucza obcego jako 'IsRequired();' ponieważ Entity Framework nie może ustawić wartości na 'null' po usunięciu obiektu nadrzędnego. – weenoid

+3

@weenoid Dziękujemy za odpowiedź. Ale czy nie byłoby bardziej sensowne usuwanie obiektu podrzędnego zamiast ustawiania wartości NULL w polu niepodlegającym zerowaniu? Tylko moje dwa centy. –

0

Upewnij się w oknie klucz obcy relacjami w SQL Server, wybrałeś Cascade jako regułę usuwania.