Problema con l'eliminazione a cascata mediante Entity Framework e System.Data.SQLite

.net entity-framework sqlite sqlite3

Domanda

Ho un DB SQLite che è impostato in modo che quando elimino una persona l'eliminazione sia in cascata. Funziona correttamente quando elimino manualmente una persona (tutti i record che fanno riferimento a PersonID sono cancellati). Ma quando uso Entity Framework per eliminare la persona ottengo un errore:

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

Non capisco perché questo si sta verificando. Il mio trigger è impostato per ripulire tutti gli oggetti correlati prima di eliminare l'oggetto che era stato detto di cancellare.

Quando vado nell'editor del modello e controllo le proprietà della relazione, non mostra alcuna azione per la proprietà OnDelete. Perché questo set non è corretto estraendolo dal DB? Se cambio questo valore in Cascade, tutto funziona correttamente, ma preferirei non fare affidamento su questa modifica manuale, perché se aggiornassi il mio modello dal DB e lo perdessi.

Ecco l'SQL pertinente per le mie tabelle.

CREATE TABLE [SomeTable] 
(
    [SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    [PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE
)
CREATE TABLE [Person]
(
    [PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
)

Risposta accettata

Ho appena affrontato questo problema esatto. Si è scoperto che quando ho usato EF per Update model from database... opzione, non ha ottenuto correttamente la regola "Cascade" per l'eliminazione.

Prova ad andare al tuo modello di database EF, fai clic sull'associazione che causa il problema, quindi assicurati che End1 OnDelete (che potrebbe essere End2, dipende dallo schema del database) sia impostato su Cascade .


Risposta popolare

Stavo avendo lo stesso problema con SQL Server. Quando ho provato ad aggiornare la modalità dal database, non ha raccolto le regole a cascata. Si noti che le regole sono state aggiunte dopo che il modello era già stato creato. Ho persino provato a eliminare un tavolo dal modello e ad aggiungerlo di nuovo. Ciò ha avuto lo stesso effetto: nessuna regola a cascata.

Tuttavia, quando ho creato un modello nuovo di zecca con le stesse tabelle esatte, ha raccolto le regole a cascata. Quindi la mia soluzione era solo eliminare il vecchio modello e crearne uno nuovo con lo stesso nome, ecc.

Immagino che ci sia qualcosa di sbagliato nel modello di aggiornamento dal processo di database.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché