2012-01-30 11 views
13

ho modello DB con tabella per ogni tipo di ereditarietà. Ad esempio, le entità sono A, B, C, A1, A2. Base - A Derivato - A1, A2. Un altro - B, C. Quindi, A ha 1-1 associazione a A1 e A2. B e C hanno associazioni (da 1 a molti, con azione OnDelete sul lato DB) rispettivamente A1 e A2.Cascade eliminare nella Entity Framework (tabella per ogni tipo di ereditarietà)

Problema

ho cercando di eliminare i record da B, quindi mi aspetto che EF rimuovere anche tutti gli oggetti A1, che associati a record corrente di B.

Alla fine, EF rimuovere record da record associati B e tutti da A1, ma non da un

Perché? come aggiustarlo?

+0

qualche suggerimento? Penso che sia un problema banale. – Developex

risposta

7

è un problema noto e io lo definirei un bug. Ovviamente, solo la cancellazione dei record dalla tabella A1 per le proprietà dell'entità derivata non può essere corretta. I restanti dati nel database (nella tabella A) rappresentano un altro tipo di oggetto. In altre parole: Questo DELETE non ha in realtà eliminare un'entità ma è cambiato il tipo di entità = trasformato un oggetto di tipo A1 in un oggetto di tipo A - che rende ancora meno senso se A è un'entità astratta.

La soluzione consigliata da here (se ho capito bene) è brutto:

var b = context.Bs.Include("A1s").Single(b => b.Id == 1); 
foreach (var a1 in b.A1s.ToList()) 
    context.As.Remove(a1); 
context.Bs.Remove(b); 
context.SaveChanges(); 

context.As.Remove(a1); dovrebbe eliminare sia da tavolo A e A1, fissando in tal modo il problema dei record orfani nella tabella A. Sfortunatamente sei costretto a caricare i bambini dal database per eliminare correttamente il genitore.

Ecco un altro di domande e risposte su questo problema: Problems using TPT (Table Per Type) in EF 4.2 and deletion of parent objects

+0

Grazie! la squadra di mictosoft sapeva di questo bug? :) sai quando verrà risolto? perché questo approccio è molto brutto. ma funziona :) – Developex

+0

@ user861108: No, non so se o quando verrà corretto. Non so neanche se la MS consideri il problema come un bug. – Slauma

+0

Penso che in quelle situazioni tutto andrà bene se si usa un altro tipo di ereditarietà. Ho usato l'ereditarietà delle tabelle per tipo. Forse se userò Table Per Hierarchy questo problema non si presenterà. Cosa ne pensi ? – Developex

0

Ho avuto lo stesso problema e un collega mi ha detto di iterare su l'insieme di elementi prima di fare Rimuovi (o) e improvvisamente tutto ha funzionato.

Problemi correlati