2012-07-18 10 views
8

Tengo ~ 300 DbSets en mi contexto y la primera consulta después de la carga de la aplicación (un FirstOrDefault() donde en un campo indexado) tarda ~ 40 segundos.¿Por qué las vistas pregeneradas de mi código EF First no tienen ningún efecto?

Para mejorar esto, yo estoy tratando de utilizar las vistas generadas previamente en EF 4.3.1 Código Primero utilizando la plantilla T4 aquí:

http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/

compilo en, pero no veo ninguna diferencia de rendimiento. Esperaba/asumía que ayudaría a la lenta y dolorosa puesta en marcha que estoy experimentando, pero no tuve suerte.

¿Lo debería ayudar? Si no, ¿para qué se utilizan exactamente las vistas pregeneradas? Y, ¿hay algo que puede hacer para mejorar el tiempo de inicio? Dividir mi contexto es doloroso por decir lo menos.

+0

Hay algo extraño con las vistas compiladas previamente en ASP.NET. He tenido el mismo problema. – jrummell

Respuesta

5

Resulta que en realidad parece buscar las vistas pregeneradas en el ensamblaje donde la primera entidad a la que se hace referencia es, no en el ensamblaje donde está el DbContext. Ver más discusión aquí: http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/#comment-76.

Para evitar esto, inventé una nueva entidad y la puse en el conjunto del contexto, y la enumeré como el primer DbSet. Ahora lo recoge y funciona bien (excepto que es ridículo).

+2

Este comportamiento también existe con Base de datos y Modelo primero. Mis vistas generadas previamente se compilan con el contexto en el mismo ensamblaje. Se recogen en una consola o aplicación de servicio de Windows, pero no en IIS. Puedo verlo porque estoy usando un T4 para generarlos y he agregado un registro. –

+1

tienen el mismo problema, pero no entiendo la solución. Tengo un asseblby con mis entidades POCO y otro ensamblaje con mi edmx. Necesito crear una entidad en mi conjunto que tenga el edmx? ¿Cómo lo enumeré como el primer DBContext? Gracias. –

5

Ciertos ORM como NHibernate y EF son lentos para iniciarse. En lugar de tratar de "arreglar" esta lentitud, me gusta eliminar el problema asegurándome de que IIS active este código siempre que se inicie el grupo de aplicaciones. Para solucionar el problema, debe configurar IIS para iniciar automáticamente su grupo de aplicaciones. Esta solución solo está disponible para .NET 4 e IIS7.5 y versiones posteriores.

desea implementar una clase con IProcessHostPreloadClient que carga un ObjectContext y configurar la aplicación para utilizarlo mediante la adición de un nodo serviceAutoStartProviders a su web.config y el establecimiento de StartMode = "AlwaysRunning" para su piscina aplicaciones aplicación.

Consulte Scott Gu's blog para obtener más información.

+0

Esa es una buena solución, pero yo, por razones terriblemente fuera de mi control, estoy atorado en Windows Server 2003 IIS6/32 bit, así que no tengo forma de usar IProcessHostPreloadClient y el sitio recicla desde mediodía todo el tiempo ... –

+0

Reciclar regularmente no es un problema. El enfoque simplemente se asegura de que el grupo de aplicaciones se inicie nuevamente, mientras que el comportamiento normal es que no se inicie hasta que llegue una llamada. Sin embargo, el IIS6 sería un obstáculo. ¿Es el alojamiento propio en un servicio de Windows una opción? – Mithon

+0

Es un problema: un usuario está utilizando el sitio, se inicia un reciclaje, su próxima solicitud va al nuevo grupo de aplicaciones y eso demora una eternidad, haciendo que parezca que el sitio está bloqueado. –

Cuestiones relacionadas