none
Ado.NET Entity Framework Modelo Herencia Lento RRS feed

  • Pregunta

  • Buenas, tengo el siguiente problema que me trae de cabeza:
    Estoy desarrollando una aplicación con ADO.Net entity framework  usando contextos de tiempo de vida cortos, a la hora de realizar una consulta tarda bastante en ir a la base de datos y recoger los resultados... del orden de un minuto al menos. La cuestión es que estos mismos métodos sobre otro modelo no es apreciable el tiempo que tarda en ejecutarse, pero sobre el modelo que tengo (la diferencia principal radica en que hay una jerarquía de herencia muy  grande) tarda demasiado...

    Quisiera saber si, a alguien más le pasa esto con la herencia  (para asegurarme de que se trata de esto) y, si hay forma de solucionarlo.. 

    Muchas gracias de antemano, 
    Saludos,
    Anthares
    miércoles, 28 de abril de 2010 16:45

Respuestas

  • hola

    el uso de procedimiento para atacar algun caso en particular, lo veo bien, desarrollar todo con SP teniendo EF medio como que pierdes las ventajas justamente de usar un ORM

     

    con el tema de la herencia que comentas, por ahi un algo grado de objetros que heredan uno de otros puede provocar que el modelo tenga que armar una consulta con muchas unines y joins entre tablas causando esto una baja performance

    por ahi el punto 2 estaria bueno probarlo, has una cosa create un bacjup de la aplciacion tal cual la tiene ahora, y luego implementa el cambio en la herencia un arbol de profundidad de 8 0 4 elementos me parece mucho, hasta dos creo que iria pero no mas, y luego compara a ver a que conclusiones llegas

    recuerda que mientras mas profundidad de hwerencia agregas la query que arma EF requieren mas joins esçntre tablas y es logico que esto afecte timepo de respuesta final

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Juan M Gómez sábado, 1 de mayo de 2010 2:39
    sábado, 1 de mayo de 2010 2:11

Todas las respuestas

  • hola

    sera que tal vez ese objeto que cargas tiene relaciones con otro, tratando de cargar toda las asociaciones, por ahi necesitas definir que se carguen por "lazy load"

    Getting Started with Entity Framework 4 – Lazy Loading

    Transparent Lazy Loading for Entity Framework – part 1

    Entity Framework and Lazy Loading

    de esta forma no cargarias toda la estructura, sino al momento de usar la asociacion entre las entidades

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 28 de abril de 2010 17:41
  • Efectivamente como dice Leandro puedes usar LazyLoading o cambiar los attach de los objectos en funcion de los que realmente necesites.

    Trabaje en un proyecto bastante grande donde el uso de Lazy Load nos salvo la vida.

    Saludos,

    Y Happy EFrameworking!

     


    MCTS - MCP - MST - New Technologies Evangelist
    miércoles, 28 de abril de 2010 20:54
  • Hola , en primer lugar gracias a ambos por contestar. 

    He estado mirando los enlaces que me pasaste, y resulta que estoy trabajando con .NET 3.5 SP1, y creo que los enlaces se refieren a a versión 4.

    En el caso de que no pueda hacer nada con la versión 3.5¿ es posible utilizar la versión 4.0 para el modelo almacenarlo en una .dll, y posteriormente utilizarlo en un proyecto ASP.NET 3.5 ?

    EDITO: Actualice a la versión 4, he activado el patrón lazyload y ha bajado a 5 segundos, pero aún así me parece demasiado tiempo, estamos hablando de una consulta que en sql tarda menos de un segundo...

    Estoy desesperado, no sé que hacer.. implementar linq2sql para las consultas sería una solución viable? y mantener EF para las inserciones.. lo veo un poco desorden eso, aunque aún así nunca he trabajado con ello y no sé si incrementará la velocidad o no.

     


    Muchas gracias, 
    Saludos cordiales,

    miércoles, 28 de abril de 2010 21:12
  • Efectivamente como dice Leandro puedes usar LazyLoading o cambiar los attach de los objectos en funcion de los que realmente necesites.

    Trabaje en un proyecto bastante grande donde el uso de Lazy Load nos salvo la vida.

    Saludos,

    Y Happy EFrameworking!

     


    MCTS - MCP - MST - New Technologies Evangelist
    Hola, como cambio los attatch el problema es en la clausula linq, que pego aquí
     
       using (var contexto = new CuestionDeOcioEntities())
                {
                    establecimientos = (from es in contexto.ESTABLECIMIENTO
                                                                       select es).ToList(); //Aquí es donde tarda... 
                    
                }
    No puedo hacer nada, ahí verdad?

    Saludos
    miércoles, 28 de abril de 2010 23:01
  • ¿ No hay nadie que me pueda orientar?

    Gracias
    viernes, 30 de abril de 2010 15:38
  • hola

    particularmente para este punto en donde notas una baja performance podrias usar Stored Prodecure

    Compatibilidad con los procedimientos almacenados (Entity Framework)

    ADO.Net Entity Framework Tools: Stored Procedures

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 30 de abril de 2010 15:44
  • Hola Leandro, 

    Gracias por tus respuestas, pero no esto no solucionaría el problema ya que, he de rescatar este tipo de entidades, por ejemplo para mostrarlas en la vista de detalle (es una aplicación ASP), y rescate una o rescate tarda los mismo, el retardo esta en el acceso a la base de datos o en la salida de la misma ( no lo tengo muy claro). 

    He probado a realizar las consultas con LINQ2SQL y tarda menos de un segundo, no se aprecia. 

    Me estoy planteando cambiar el EF por LINQ2SQL... Cómo lo ves? es una buena opción? Nunca lo he usado y no quiero volver a meter la pata.

    Gracias, 
    Atentamente,
    Anthares
    viernes, 30 de abril de 2010 18:34
  • hola

    no te lo aconsejaria, segun tengo entendido el soporte que dara Microsoft a Linq Sql esta limitado, y sera reemplzado por EF en el futuro

    mira este articulo

    ¿ Chau a LINQ to SQL ?

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 1 de mayo de 2010 1:47
  • Hola,

    Vaya, gracias por el articulo no usare LINQ2SQL entonces, 

    Veo dos posibles salidas, ninguna de ellas termina de converceme, las expongo:

    1. Utlizar como bien me has dicho procedimientos almacenados y vistas, pero es inevitable en algún momento llamar a la linq to entity y se producirá el retraso, aunque puedo intentar que sea en zonas controladas. Algo que no me gusta de eso, es que es dejar lógica de la aplicación en la base de datos, no me gusta ese tipo de práctica.. pero a grandes males....
    2. Eliminar el modelo de herencia, estoy seguro que sin él la aplicación va lo rápido que tendría que ir, de hecho hay relaciones de uno a muchos en ese mismo modelo y las consultas  van realmente rápidas. El problema es que, hay una clase base de la que derivan 8 clases especializadas, y en algunas de estas clases especializadas derivan hasta 4 clases más...
    Qué me aconsejas que haga?

    Muchas gracias por tu tiempo,
    Anthares

    sábado, 1 de mayo de 2010 2:04
  • hola

    el uso de procedimiento para atacar algun caso en particular, lo veo bien, desarrollar todo con SP teniendo EF medio como que pierdes las ventajas justamente de usar un ORM

     

    con el tema de la herencia que comentas, por ahi un algo grado de objetros que heredan uno de otros puede provocar que el modelo tenga que armar una consulta con muchas unines y joins entre tablas causando esto una baja performance

    por ahi el punto 2 estaria bueno probarlo, has una cosa create un bacjup de la aplciacion tal cual la tiene ahora, y luego implementa el cambio en la herencia un arbol de profundidad de 8 0 4 elementos me parece mucho, hasta dos creo que iria pero no mas, y luego compara a ver a que conclusiones llegas

    recuerda que mientras mas profundidad de hwerencia agregas la query que arma EF requieren mas joins esçntre tablas y es logico que esto afecte timepo de respuesta final

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Juan M Gómez sábado, 1 de mayo de 2010 2:39
    sábado, 1 de mayo de 2010 2:11
  • Hola

    Ok, gracias por todo Leandro, probaré y comentaré los resultados.

     

    Lo marco como respuesta.

    saludos y gracias!

    Anthares

    sábado, 1 de mayo de 2010 2:39
  • Al final he optado por eliminar la herencia y continuar con EF, va mucho más rápido, es una pena que pase lo que pasa con la herencia, no sé si en otros ORM pasará lo mismo, en cualquier caso espero que microsoft mejore este aspecto de EF.

    Muchas gracias,
    Anthares
    sábado, 8 de mayo de 2010 0:40