none
Entity Framework 4 + MySql5.5 Consulta não traz dados atualizados RRS feed

  • Pergunta

  • Olá pessoal,

     

    tenho um aplicação que usa EF4 e MySql5.5 e funciona legal. Mais estou tendo problemas numa thread. Implementei uma thread que faz uma consulta pequena no banco de 5 em 5 segundos, o problema é que vou ao banco e mudo um valor manualmente e a thread não enxerga essas mudanças. Se eu paro de rodar o software e reinicio a execução ela traz corretamente, se eu mudar novamente com a aplicação rodando nada acontece.

    Será que pode ser algum cache?

    sexta-feira, 16 de dezembro de 2011 17:53

Respostas

Todas as Respostas

  • Pode ser Cache sim. Veja se limpando o objeto antes de setar o Bind resolve.

    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    sexta-feira, 16 de dezembro de 2011 18:54
  • Olá Elias,

    O ET tem um cache interno para atualização dos registros.

    Poste o seu código e veremos o que podemos fazer.

    Uma dica: tente criar uma nova instância do seu DataContext sempre que for fazer uma consulta.

    []s!
    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    sexta-feira, 16 de dezembro de 2011 19:08
    Moderador
  • Pode ser Cache sim. Veja se limpando o objeto antes de setar o Bind resolve.

    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    Olá Paulo, como eu poderia fazê-lo?
    sexta-feira, 16 de dezembro de 2011 19:22
  • Olá Elias,

    O ET tem um cache interno para atualização dos registros.

    Poste o seu código e veremos o que podemos fazer.

    Uma dica: tente criar uma nova instância do seu DataContext sempre que for fazer uma consulta.

    []s!
    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    Então Fernando foi exatamente o que eu fiz para tentar resolver o problema mas sem sucesso. Abaixo segue o código do método que a Thread chama:
    private void ConsultaAtualizacaoGrafico(object sender)
            {
                while (true)
                {
                    Thread.Sleep(2000);
                    m_Db.Connection.Open();
    
                    //m_Db.SaveChanges();
    
                    TipoVaga tVaga = (from tv in m_Db.TipoVaga where tv.Id.Equals(m_TipoVaga.Id) select tv).FirstOrDefault();
    
                    m_Disponiveis = tVaga.QuantidadeTotal - tVaga.QuantidadeOcupada;
                    m_Ocupadas = tVaga.QuantidadeOcupada;
    
                    AtualizaGrafico();
    
                    m_Db.SaveChanges();
                    m_Db.Connection.Close();
                }
            }
    

    sexta-feira, 16 de dezembro de 2011 19:24
  • 1 - Como o Fernando disse, você cria uma nova instância do seu objeto? Tem que criar.

    2 - O que Eu quis dizer é: Pegue o objeto que recebe a consulta e limpe ele. Exemplo: DadosRetorno = null;


    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    sexta-feira, 16 de dezembro de 2011 19:29
  • Ok Paulo, segue meu código alterado, sem sucesso...

     

    private void ConsultaAtualizacaoGrafico(object sender)
            {
                while (true)
                {
                    Thread.Sleep(2000);
                    if (m_Db == null)  m_Db = new NetPlusRepositorioEntities();
                    m_Db.Connection.Open();
    
                    TipoVaga tVaga = (from tv in m_Db.TipoVaga where tv.Id.Equals(m_TipoVaga.Id) select tv).FirstOrDefault();
    
                    m_Disponiveis = tVaga.QuantidadeTotal - tVaga.QuantidadeOcupada;
                    m_Ocupadas = tVaga.QuantidadeOcupada;
    
                    AtualizaGrafico();
    
                    m_Db.SaveChanges();
                    m_Db.Connection.Close();
    
                    tVaga = null;
                    GC.Collect();
                }
            }
    


    As propriedades tVaga.QuantidadeTotal e tVaga.QuantidadeOcupada sempre retornam o mesmo valor, mesmo que os modifique
    diretamente no banco de dados....

     


    • Editado Elias Júnior sexta-feira, 16 de dezembro de 2011 19:48
    sexta-feira, 16 de dezembro de 2011 19:47
  • Você sabia que não tem que ficar abrindo e fechando a conexão? No EF é gerenciado automaticamente.

    Fiz um teste aqui e funcionou. Veja:

                    int numeroVezes = 1;
    
                    while (true)
                    {
                        System.Threading.Thread.Sleep(10000);
                        ModeloContainer dbEF = new ModeloContainer();
                        var queryEntityFramework = (from p in dbEF.TB_Categoria
                                                    select p).FirstOrDefault();
    
                        queryEntityFramework.Nome = "Nome " + numeroVezes;
    
                        dbEF.SaveChanges();
    
                        numeroVezes++;
    
                        Console.WriteLine(queryEntityFramework.Nome);
                    }
    

     


    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    sexta-feira, 16 de dezembro de 2011 20:03
  • O problema esta nessa linha:

     if (m_Db == null)  m_Db = new NetPlusRepositorioEntities();
    


    O repositório deveria ser instanciado todas as veses...

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    • Marcado como Resposta Elias Júnior segunda-feira, 19 de dezembro de 2011 10:22
    sábado, 17 de dezembro de 2011 14:49
    Moderador
  • Tá ai Fernando,

    você matou o problema, realmente foi só instanciar o repositório todas as vezes que deu certo. Muito obrigado!! Segue abaixo o código modificado que deu certo:

    private void ConsultaAtualizacaoGrafico(object sender)
    {
                while (true)
                {
                    Thread.Sleep(2000);
                    m_Db = new NetPlusRepositorioEntities();
                    m_Db.Connection.Open();
    
                    TipoVaga tVaga = (from tv in m_Db.TipoVaga where tv.Id.Equals(m_TipoVaga.Id) select tv).FirstOrDefault();
    
                    m_Disponiveis = tVaga.QuantidadeTotal - tVaga.QuantidadeOcupada;
                    m_Ocupadas = tVaga.QuantidadeOcupada;
    
                    AtualizaGrafico();
    
                    m_Db.SaveChanges();
                    m_Db.Connection.Close();
    
                    tVaga = null;
                    m_Db = null;
                    GC.Collect();
                }
    }
    
    Abraço a todos e mais uma vez muito obrigado!!!

    segunda-feira, 19 de dezembro de 2011 10:25