2010-07-18 12 views

risposta

33

Ora che hai letto la risposta di tutti, ti darò la risposta corretta. EF non supporta il caricamento lazy delle proprietà. Tuttavia supporta un concetto molto potente di questo. Si chiama suddivisione delle tabelle in cui è possibile mappare una tabella a due entità. Supponiamo che una tabella di prodotto nel database possa essere mappata all'entità prodotto e all'entità ProductDetail. È quindi possibile spostare i campi costosi sull'entità ProductDetail e quindi creare un'associazione 1..1 tra prodcut e productdetail entity. È quindi possibile caricare l'associazione productdetail pigro solo quando è necessario. Nel mio capitolo sulle prestazioni del mio libro, ho una ricetta chiamata. 13-9. Spostare una proprietà costosa in un'altra entità

Spero che questo aiuti!

Julie Lerman has an article on how to split a table

+3

Grazie. Dovrò farlo. Ma EF4 dovrebbe supportare il caricamento lazy su proprietà scalari, può essere davvero utile. –

+0

So che il team sta lavorando per supportare le proprietà di caricamento lazy box nella prossima versione, ma penso che lo spostamento di colonne costose in un'altra entità apra le strade per ritardare il caricamento di numerose proprietà costose contemporaneamente. Immagina di avere un oggetto dipendente con EmployeePicture e una descrizione dell'addetto che sono entrambi costosi e che vuoi ritardare il caricamento di entrambi, ma ogni volta che vuoi caricarli, vuoi caricarli insieme. Questo è qualcosa che non puoi fare in linq a sql. – zeeshanhirani

+0

Sì, se ci sono più di un campo costoso, in questo caso il team EF può abilitare un flag come LoadAllLazyProperties che consente a EF di caricare tutte le proprietà scalari contrassegnate come Lazy Load insieme, ogni volta che ne viene richiesto uno. Questo migliora le situazioni come quella che hai menzionato senza separare EntityTypes !! –

1

gli stimoli sono corretti, ma attenzione quando si utilizza il caricamento lazy. Potresti avere problemi di prestazioni e non rendersi conto che la proprietà viene caricata in una posizione specifica del tuo codice. Questo perché carica i dati quando si utilizza la proprietà

Preferisco utilizzare il caricamento esplicito. In questo modo sai quando vengono caricati e dove. Ecco un collegamento che fornisce un esempio per LoadProperty http://sankarsan.wordpress.com/2010/05/09/ado-net-entity-framework-data-loading-part-2/

È inoltre possibile caricare Eager utilizzando il metodo Include. Esempio qui: http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework

+0

stimms e Dan, non voglio dire una proprietà correlata, mi riferisco a un campo (membro della classe) come Biografia (stringa in C# o varchar (1024) in SQL Server), che è davvero costoso da caricare con l'entità, mi piacerebbe caricarlo pigro quando necessario. Per quanto ne so, questo non funziona in EF4. C'è un modo per farlo? –

+1

Quindi vuoi caricare pigro una proprietà scalare? Appena fuori dalla mia testa, potrei provare a suddividere la biografia in essa su Entity e impostarla come proprietà di navigazione. Allora sarei in grado di pigro/ansioso/expicit caricarlo. Potrebbe esserci un modo migliore ... metterò alla prova questa teoria quando avrò la possibilità. –

+0

Grazie, sembra essere l'unico modo efficace. –

6

Con una struttura scalare, l'unico modo per selettivamente non caricare una certa proprietà è di proiettare in ESQL o L2E:

var q = from p in Context.People 
     select new 
     { 
      Id = p.Id, 
      Name = p.Name // note no Biography 
     }; 

+1 a Dan; fare questo pigramente è peggio che caricarlo in avanti. Se vuoi controllare il caricamento, sii esplicito.

+0

Grazie per questo suggerimento. Sì, ma questa proiezione non è efficiente. In primo luogo, risulterebbe in un tipo anonimo che non può essere utilizzato direttamente da People. Un nuovo oggetto People deve essere creato e istanziato correttamente, il che sarà una perdita di tempo nell'analisi tra gli oggetti. Questo tipo non sarà tracciabile dal contesto. –

+2

@Nazaf, stai ottimizzando prematuramente. –

Problemi correlati