2009-06-23 10 views
21

Entity framework es muy lento, así que traté de usar un procedimiento almacenado, pero me encontré con este problema.Usando un procedimiento almacenado en el marco de la entidad, ¿cómo obtengo que la entidad tenga sus propiedades de navegación pobladas?

Entity Framework le permite definir un procedimiento almacenado que produce una entidad. Sin embargo, mi entidad tiene 'propiedades de navegación' que no se completan cuando se utiliza este método.

¿Hay algún problema?

+1

¿Tal vez podría darnos algunos ejemplos de lo que está haciendo con EF que es "tremendamente lento"? No he encontrado que EF sea notablemente más lento en la mayoría de los casos a menos que esté haciendo algo que lo haga ineficiente. –

Respuesta

19

Los procedimientos almacenados correctamente no se pueden componer. Así que no hay forma de llamar a su SPROC y hacer que el EF rellene automáticamente las relaciones en la misma consulta, usando Include() o algo así.

Así que supongamos que tiene productos y categorías

y tiene un procedimiento almacenado para obtener los productos

decir

var products = context.GetProducts(someproductfilter); 

los productos resultantes no han cargado sus categorías.

Sin embargo, si usted tiene un segundo procedimiento almacenado que recibe las categorías de dichos productos:

es decir

var categories = context.GetCategoriesForProducts(someproductfilter); 

una característica de la FE se llama relación de corrección, que une las entidades relacionadas vez que la segunda entidad entra en el contexto, se asegurará de que después de realizar ambas llamadas, cada producto en productos tendrá una Categoría no nula.

Esto no es ideal, porque está haciendo más de una consulta, pero funcionará.

Una alternativa es usar EFExtensions. El tipo que escribió eso creó la capacidad de escribir sprocs que cargan más datos de una vez.

Esperanza esto ayuda

Saludos Alex

+0

¿Esta respuesta está actualizada?- Estoy buscando exactamente lo mismo que OP. –

+0

@KristianNissen ¿alguna vez descubrió si hay una manera mejor? Han pasado 5 años, así que espero que EF6 tenga una solución. – Todilo

4

encontré esta cuestión de forma cuando la investigación de procedimientos almacenados (SP) con EF. También veo que personas como @KristianNissen y @Todilo han preguntado si hay una actualización con EF6.

La respuesta es sí, EF 6 ha cambiado las cosas, pero no agregó nada para ayudar a cargar las propiedades de navegación cuando se utilizan SP. Tampoco puede usar el método .Include() con SP como se solicitó en este SO question.

La única manera es escribir su SP para cargar específicamente las propiedades de navegación. Sin embargo, ahora hay una buena documentación de Microsoft sobre el uso de SP: consulte Query SP y SP returning multiple result sets.

Para completar, el cambio que introdujo EF versión 6 fue para permitir que los Procedimientos almacenados (SP) manejen la inserción, actualización y eliminación - vea Microsoft article y Entity Framework Tutotial.

+0

gracias por el comentario – user48545

Cuestiones relacionadas