2009-06-23 6 views
21

Il framework Entity è estremamente lento, quindi ho provato a utilizzare una stored procedure, ma ho riscontrato questo problema.Utilizzando una procedura memorizzata nell'entità framework, come posso ottenere che l'entità abbia le sue proprietà di navigazione popolate?

Entity Framework consente di definire una stored procedure che produce un'entità. Tuttavia la mia entità ha "proprietà di navigazione" che non vengono popolate quando si utilizza questo metodo.

C'è un lavoro in giro?

+1

Forse potresti darci qualche esempio di ciò che stai facendo con EF che è 'paralizzante lentamente'? Non ho trovato EF notevolmente più lento nella maggior parte dei casi, a meno che non stia facendo qualcosa che lo rende inefficiente. –

risposta

19

Le stored procedure non sono componibili. Quindi non c'è modo di chiamare il tuo SPROC e fare in modo che l'EF inserisca automaticamente le relazioni nella stessa query, usando Include() o qualcosa del genere.

Così dicono si dispone di prodotti e categorie

e hai uno sproc per ottenere prodotti:

cioè

var products = context.GetProducts(someproductfilter); 

i prodotti risultanti non avranno le loro categorie caricato.

Tuttavia, se si dispone di una seconda stored procedure che ottiene i categorie per detti prodotti:

cioè

var categories = context.GetCategoriesForProducts(someproductfilter); 

una caratteristica in EF chiamato rapporto di correzione, che lega entità correlate una volta che la seconda entità entra nel contesto, assicurerà che dopo aver effettuato entrambe le chiamate, ciascun prodotto nei prodotti avrà una categoria non nullo.

Questo non è l'ideale, perché stai facendo più di una query, ma funzionerà.

Un'alternativa è utilizzare EFExtensions. Il tizio che ha scritto ha creato la capacità di scrivere sproc che caricano più dati in una volta sola.

Spero che questo aiuti

Saluti Alex

+0

Questa risposta è aggiornata?- Sto cercando esattamente lo stesso di OP. –

+0

@KristianNissen hai mai scoperto se c'è un modo migliore? Sono passati 5 anni, quindi spero che l'EF6 abbia una soluzione. – Todilo

4

ho trovato questa domanda SO quando la ricerca di stored procedure (SP) con EF. Vedo anche persone come @KristianNissen e @Todilo hanno chiesto se c'è un aggiornamento con EF6.

La risposta è sì, EF 6 ha cambiato le cose, ma non ha aggiunto nulla per aiutare a caricare le proprietà di navigazione quando si utilizzano SP. Né puoi usare il metodo .Include() con SP come richiesto in questo SO question.

L'unico modo è scrivere il SP per caricare in modo specifico le proprietà di navigazione. Tuttavia, vi è ora una buona documentazione di Microsoft sull'utilizzo degli SP, vedere Query SP e SP returning multiple result sets.

Per completezza, la modifica apportata da EF versione 6 era quella di consentire a Stored Procedures (SP) di gestire l'inserimento, l'aggiornamento e l'eliminazione - vedere Microsoft article e Entity Framework Tutotial.

+0

grazie per il commento – user48545

Problemi correlati