Problemi di ereditarietà con Entity Framework (tabella per tipo)
-
03-07-2019 - |
Domanda
Per parte del progetto su cui sto attualmente lavorando, ho una serie di quattro tabelle per azioni sindacabili. Una tabella è la base astratta per le altre tre e ogni tabella è rappresentata nel mio modello EF in questo modo:
Modello EF - Azioni http: // chris. charabaruk.com/system/files/images/EF+Model+Actions.png
Ci sono due problemi che sto affrontando, tuttavia. Il primo problema è che Actor
(un riferimento a un User
) e Subject
(un riferimento a un'entità della classe associata a ciascun tipo di azione) sono null
nelle mie sottoclassi, nonostante le colonne del database associate contengano chiavi valide per le righe nelle loro tabelle associate. Sebbene sia possibile ottenere le chiavi tramite ActorReference
e SubjectReference
, ovviamente è necessario impostare un nuovo contesto EF e interrogarlo per gli oggetti di riferimento (come Foo
Reference.Value
è anche nullo).
Il secondo problema è che la fine reciproca della relazione tra le classi di azioni concrete e le rispettive classi di entità correlate non rivela sempre nulla. Ad esempio, Task.RelatedActions
, che dovrebbe fornirmi tutti gli oggetti TaskAction
dove Subject
si riferisce al particolare oggetto task su cui RelatedActions
viene chiamato, è completamente privo di oggetti. Ancora una volta, nel database esistono righe valide, Entity Framework non le inserisce negli oggetti e non me le passa.
Qualcuno sa cosa sto facendo di sbagliato e cosa dovrei fare per farlo funzionare?
Aggiornamento: sembra che nessuna delle proprietà della relazione funzioni più nel mio modello di entità, affatto. WTF ...
Soluzione
Penso che il problema riscontrato qui sia che, per impostazione predefinita, l'EF non carica automaticamente le entità correlate. Se carichi un'entità, la raccolta o il riferimento a entità correlate saranno vuoti a meno che tu non esegua una delle seguenti operazioni:
1) Usa il caricamento desideroso per recuperare la tua entità principale e la tua entità correlata in una singola query. Per fare ciò, modifica la tua query aggiungendo una chiamata al metodo Include. Nell'esempio sopra, potresti utilizzare la seguente query:
from a in context.Actions.Include("Actor") select a
Ciò recupererebbe ciascuna delle azioni con il relativo metodo Actor.
2) Usa il caricamento lento esplicito per recuperare l'entità correlata quando ne hai bisogno:
action1.ActorReference.Load()
Nella versione dell'EF che verrà fornita con .Net 4.0, avrai anche la seguente opzione aggiuntiva:
3) Attiva il caricamento lento implicito in modo che le entità correlate vengano recuperate automaticamente quando fai riferimento alla proprietà di navigazione.
- Danny