Implicit Cod-Primul includ în cascadă șterge pentru chei străine care nu acceptă o valoare NULL, folosind SQL-cod corespunzător pentru a crea masa. Intr-un articol anterior, vom descrie modul în care să specificați un cod care-întâi trebuie utilizat întotdeauna o cheie străină (de exemplu, să mențină restricții NOT NULL). Să ne amintim cum se face:
Puteți specifica în mod explicit proprietatea cheie străină, atunci codul unulea utilizează valoarea implicită a NOT NULL în baza de date pentru ea. În exemplele pe care le-am folosit chei străine CodClient și IdUtilizator.
În cazul în care un comutator extern nu este specificat în clasa de model, atunci codul-mai întâi generează automat, permițând utilizarea NULL. Pentru a schimba acest lucru, puteți utiliza atributul obligatoriu pentru proprietățile de navigare ale modelului.
Să ne uităm la un exemplu folosind cascadă șterge exemplul proiectului nostru de testare ASP.NET. Pentru a face acest lucru, adăugați o nouă formă de web CascadeDelete.aspx și adăugați următorul cod:
În această formă, cele două butoane sunt utilizate pentru a elimina și stoca datele. Codul handler Save_Click are loc crearea arbitrară obiect Client trei obiecte legate ordine, după care aceste date sunt introduse în baza. Handler cod Delete_Click vom extrage mai întâi datele dorite din baza de date a clientului, și apoi ștergeți-l. Rețineți că folosește „încărcare dornic“ (încărcare dornici). deoarece Include o numim metoda (). Acest lucru înseamnă că, în plus față de datele clientului, toate comenzile datele aferente vor fi extrase. De fapt, în cascadă șterge în acest caz, nu este necesar, deoarece am eliminat toate comenzile aferente.
Modelul de date în acest moment este după cum urmează:
Faceți clic pe butonul „Delete“ pentru a vă asigura că datele cumpărătorului și ordinele aferente sunt eliminate în mod corect. În acest caz, cadru Entitate va trimite patru baze de date de interogare delete (trei pentru fiecare comandă și unul pentru cumpărător). Să ne întoarcem acum pe utilizarea de încărcare și, evident, dornici de a utiliza ștergeri în cascadă. Codul de mai jos arată handler Delete_Click modificat:
Aici, am eliminat Include () metoda de provocare, iar acum Cod-Primul nu este conștient de comenzile asociate cumpărătorului. Spre deosebire de exemplul anterior, aici Entity Framework trimite o solicitare DELETE pentru a șterge client. Când executați această lucrare de interogare înseamnă cascadă șterge și SQL Server ordine legate de acestea le va elimina mai întâi, și apoi mai târziu, scoateți cumpărătorul.
Dezactivarea datelor de ștergere în cascadă
Este important să ne amintim că, dacă dezactivați cascadă șterge erorile de aplicare pot să apară dacă nu avea grijă de extragerea datelor aferente înainte de ștergere, așa cum am făcut în primul exemplu folosind „încărcare dornici.“
Dezactivarea sau activarea unei cascadă șterge API Fluent permite WillCascadeOnDelete metoda (). care parametru logic transmis. Folosind această metodă este prezentată în exemplul de mai jos:
Dacă executați aplicația și încercați să ștergeți datele utilizând un al doilea exemplu de tratare a Delete_Click, o excepție este aruncată, așa cum se arată în figura de mai jos:
Așa cum este descris mai devreme, atunci când datele sunt șterse din tabelul părinte, trebuie să aibă grijă cu privire la ștergerea de date din tabelul derivate. Am uitat pentru a extrage date de ordine legate de acestea din tabelul de comenzi, și așa mai departe SQL Server returnează o eroare atunci când încercați să ștergeți datele numai către cumpărător. Dacă rândul său, acum „încărcare dornici“ folosind Include metoda () în handler Delete_Click, această eroare va dispărea, dar să fie un nou - așa cum este descris mai sus, în acest caz, codul unulea trimite patru cereri de ștergere și îndepărtarea primului ordin Cod-First să stabilească o valoare pentru NULL Order.Customer proprietății, și din moment ce Modelul nostru conține o cheie străină, care nu poate fi nul eșuează.
Ca cascadă șterge de închidere necesar pentru tabele care definesc anumite relații între ele. Unele baze de date (inclusiv SQL Server) nu acceptă mai multe relații care definesc o cascadă șterge să fie marcate pe un singur tabel.