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 ...

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top