none
EF4. Sempre carrega toda a tabela... RRS feed

  • Pergunta

  • Estou com alguns problemas em relação ao LazyLoading.

    Por exemplo: Usuario.Posts.Count().

    Pra fazer este Count o EF4 faz um select de todos os Posts do Usuario primeiro. Isso é um absurdo, não tem como usar em uma aplicação real.

    Isso também causa uma outra consequencia. Quando você adiciona um Post pro Usuario, o AssociationFixUp referencia os Posts dele, nisso o EF4 também carrega todos os posts.

    Outros ex.:

    Usuario.Posts.First()

    Usuario.Posts.Count(x => x.Ativo)


    http://blog.fujiy.net/ - MCPD em .Net 2.0
    sexta-feira, 21 de maio de 2010 11:03

Respostas

  • Parece que não da pra fazer desta forma mesmo.

     

    O que estou fazendo agora é desativar o Lazy e uso a classe de Contexto do EF4 direto nos controllers.

    Ficou mais rapido, só seleciono as colunas que preciso.

    E Mais simples. Nao preciso ficar criando repositorio que em geral era sempre um trabalho repetitivo e duplicado.

     

     

     


    http://blog.fujiy.net/ - MCPD em .Net 2.0
    sexta-feira, 25 de junho de 2010 14:55

Todas as Respostas

  • Olá, você não pode desabilitar o Lazy Loading e utilizar Explicit Loaging ou Eager Loading?

     

    Explicit Loading, ou carregamento explicito, você especifica através do metódo Load quando uma entidade será carregada, é util quando você deve recuperar uma entidade e a associação em momentos distintos, visto que o carregamento da entidade e da associação serão traduzidas em duas consultas ao banco de dados:

     

    if(!Usuario.Posts.IsLoaded)

    {
    Usuario.Posts.Load();

    }

     

    Quanto ao Eager Loading, ou carregamento ansioso, é um metodo interessante pois carrega a entidade e a associação em um mesmo momento gerando somente uma consulta ao banco de dados:

     

    Usuario user = (from u in context.Usuario.Include("Posts")

                           select u).FirstOrDefault();

     

    O interessante nestes dois metodos para o seu caso é que você pode especificar quando uma entidade será carregada, diferentemente do Lazy Loading que carrega a associação sempre que a propriedade de navegação for acessada.

    Att


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP
    sábado, 22 de maio de 2010 19:14
  • O problema é que estou fazendo tudo bem separado. A camada de apresentação, no caso MVC, não tem como carregar estes dados. Eu precisaria criar um método na camada de dados pra cada conjunto de propriedades que eu desejasse
    http://blog.fujiy.net/ - MCPD em .Net 2.0
    domingo, 6 de junho de 2010 18:46
  • Felipe,

    Conseguiu solucionar sua questão?


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 25 de junho de 2010 13:49
    Moderador
  • Parece que não da pra fazer desta forma mesmo.

     

    O que estou fazendo agora é desativar o Lazy e uso a classe de Contexto do EF4 direto nos controllers.

    Ficou mais rapido, só seleciono as colunas que preciso.

    E Mais simples. Nao preciso ficar criando repositorio que em geral era sempre um trabalho repetitivo e duplicado.

     

     

     


    http://blog.fujiy.net/ - MCPD em .Net 2.0
    sexta-feira, 25 de junho de 2010 14:55