none
Chamada Json necessitando de conexão válida RRS feed

  • Pergunta

  • Bom dia.

    Fiz carregamento dinâmico de combos com Json e funciona muito bem. 

    Porém está ocorrendo o seguinte:

    public JsonResult ListarCidadesPorSiglaEstado(string sigla)
            {
                CidadeRepository CR = new CidadeRepository();
                var Dados = CR.RetornarCidadesPorSiglaEstado(sigla);
                CR.Dispose();
                return Json(new { Result = Dados }, JsonRequestBehavior.AllowGet);
            }

    Se eu fizer chamar o Dispose do repository, dá o seguinte erro:

    Server Error in '/' Application.
    The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
    Exception Details: System.ObjectDisposedException: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

    Código do Repository:

    public IEnumerable<Cidade> RetornarCidadesPorSiglaEstado(string pSigla)
            {
                var Data = (from i in _Contexto.DbCidade
                            where i.Estado.Sigla.Equals(pSigla)
                            select i).ToList();
                return Data;
            } 

    Se eu não chamar o CR.Dispose() funciona perfeitamente. Até onde seu fazendo o ToList() ele já foi no banco e a conexão não é necessária.

    O que pode ser? Obrigado!!!!

    segunda-feira, 25 de março de 2013 14:27

Todas as Respostas

  • Olá,

    Seu contexto é estático?

    segunda-feira, 25 de março de 2013 14:35
  • Não precisa dar o "dispose" no objeto do seu repositório. 

    O GC (garbage collector) do framework já faz isso pra vc.

    O caso é que mesmo com os dados carregados eles ainda estão acoplados ao objeto. Quando você dá o dispose os dados ficam indisponíveis para outras operações.

    segunda-feira, 25 de março de 2013 16:06
    Moderador
  • Olá,

    Seu contexto é estático?

    Meu Repository herda de uma classe que instancia sempre o meu contexto.  Esta:

    public abstract class RepositoryBase : IDisposable
        {
            protected GestorWebContext _Contexto;
            public RepositoryBase()
            {
                if (GestorWebUtils.Registros == null)
                    GestorWebUtils.Registros = new List<int>();
                _Contexto = new GestorWebContext();
            }
            private bool disposed = false;
            protected virtual void Dispose(bool disposing)
            {
                if (!this.disposed)
                {
                    if (disposing)
                    {
                        _Contexto.Dispose();
                    }
                }
                this.disposed = true;
            }
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
            public void SalvarDados()
            {
                try
                {
                    _Contexto.SaveChanges();
                }
                catch (DbEntityValidationException ex)
                {
                    throw new Exceptions.GestorWebException(ex);
                }            
                catch (DbUpdateConcurrencyException ex)
                {
                    throw new Exceptions.GestorWebException(ex);
                }
                catch (DbUpdateException ex)
                {
                    throw new Exceptions.GestorWebException(ex);
                }
                catch (Exception ex)
                {
                    throw new Exceptions.GestorWebException(ex);
                }
            }
        }

    segunda-feira, 25 de março de 2013 16:09