none
Dispose no ObjectContext RRS feed

  • Pergunta

  • Galera, gostaria de saber a diferença na utilização nos dois códigos abaixo:

    using (myEntities = new MyEntities())
                {
                    IQueryable<Produto> iQueryableProduto = myEntities.Produto.AsQueryable<Produto>();
                    return iQueryableProduto.Where(x => x.Modelo.IdSegmento == idSegmento).OrderBy(x => x.Modelo.Pontos).ToList();
                }

    e

                MyEntities myEntities = new MyEntities();
                
                IQueryable<Produto> iQueryableProduto = myEntities.Produto.AsQueryable<Produto>();
                return iQueryableProduto.Where(x => x.Modelo.IdSegmento == idSegmento).OrderBy(x => x.Modelo.Pontos).ToList();

    Quando utilizo o primeiro, e tento resgatar uma tabela relacionada a de produtos, ocorre o seguinte erro:

    The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

    Gostaria de saber se pode influenciar o desempenho da minha aplicação caso eu não utilize o Dispose().

    Obrigado.

    quarta-feira, 6 de fevereiro de 2013 15:45

Todas as Respostas

  • Boa tarde Eduardo,

    quando você chama o método Dispose ele diz ao GC que o objeto está  pronto para ser liberado da memória, e a sua vida util na memória é menor, logo, faz sim diferença em não usa-lo

    Este (http://www.macoratti.net/vbn5_dpo.htm) artigo do macoratti irá auxilia-lo bem quanto a sua duvida..

    Abraços,

    Afonso

    quarta-feira, 6 de fevereiro de 2013 16:08
  • Já tentou

    IQueryable<Produto> iQueryableProduto = myEntities.Produto.Include("OUTRA_PROPRIEDADE).AsQueryable<Produto>();

    Para você entender, quando você acessa uma propriedade relacionada, o que acontece é uma busca no banco de dados, pois é Lazy Load, isto é, não vai trazer o valor da propriedade até que alguém acesse aquela propriedade requisitando o seu valor. Como você está fazendo um Dispose (utilizando a sintaxe "using"), não existe mais um objeto para acessar o banco. Por isso o erro.

    Quando você utiliza o método Include, você pode falar quais outras propriedades você quer que já venham preenchidas, descartando o Lazy Load delas...

    Creio que seja isso.


    Take a look at WPF FlashMessage
    About.me

    quarta-feira, 6 de fevereiro de 2013 16:21
  • Muito bom Joba, acredito que esta seja a melhor solução.
    Pois inativando o Lazy Loading prejudicaria muito o desempenho da aplicação.

    Obrigado.

    quarta-feira, 6 de fevereiro de 2013 17:03