none
Esta bien el uso de using y dispose() en este código? RRS feed

  • Pergunta

  • public class UsuariosDAL:IDisposable
        {
    
            ComunidadContext db = new ComunidadContext();
            public Usuarios ConsultarUsuario(Usuarios user)
            {
                using (db)
                {
                    var usuario = db.Usuarios.FirstOrDefault(x => x.USU_EMAIL == user.USU_EMAIL && x.USU_CLAVE == user.USU_CLAVE);
    
                    if (usuario != null)
                    {
                        return usuario;
                    }
                    else
                    {
                        return null;
                    }
                }            
            }
    

    y luego el dispose()

    public void Dispose()
            {
                ((IDisposable)db).Dispose();
            }

    He visto que la instancia del dBContext lo colocan dentro del using. Como haria para llamar a db.Dispose() en el metodo si el tiempo de vida de la instancia dura solo en el using? Podrian explicarme un poco como hacer el dispose(). Al implementar la interfaz IDisposable me genera este metodo Dispose() expuesto si hay una instancia del DbContext. Es decir si uso using(ComunidadContext db = new ComunidadContext)

    {

    // bloque de codigo

    }

    Como haria para que llamar al metodo Dispose();

    He leido algo sobre que el metodo Dispose se ejecuta automaticamente luego del using. pero mi pregunta es sobre como llamda al metodo  db.Dispose() si la instancia del DbContext solo dura en el using?

    quarta-feira, 19 de fevereiro de 2020 16:02

Todas as Respostas

  • public class UsuariosDAL:IDisposable
        {
    
            ComunidadContext db = new ComunidadContext();
            public Usuarios ConsultarUsuario(Usuarios user)
            {
                using (db)
                {
                    var usuario = db.Usuarios.FirstOrDefault(x => x.USU_EMAIL == user.USU_EMAIL && x.USU_CLAVE == user.USU_CLAVE);
    
                    if (usuario != null)
                    {
                        return usuario;
                    }
                    else
                    {
                        return null;
                    }
                }            
            }

    y luego el dispose()

    public void Dispose()
            {
                ((IDisposable)db).Dispose();
            }

    He visto que la instancia del dBContext lo colocan dentro del using. Como haria para llamar a db.Dispose() en el metodo si el tiempo de vida de la instancia dura solo en el using? Podrian explicarme un poco como hacer el dispose(). Al implementar la interfaz IDisposable me genera este metodo Dispose() expuesto si hay una instancia del DbContext. Es decir si uso using(ComunidadContext db = new ComunidadContext)

    {

    // bloque de codigo

    }

    Como haria para que llamar al metodo Dispose();

    He leido algo sobre que el metodo Dispose se ejecuta automaticamente luego del using. pero mi pregunta es sobre como llamda al metodo  db.Dispose() si la instancia del DbContext solo dura en el using?

    el uso del using es que te evitas usar Dispose cuando lo realizas

    using (ComunidadContext db = new ComunidadContext())using (ComunidadContext db = new ComunidadContext())

    al cerrar con las llaves el using tienes el metodo dispose como lo indica aca

    quarta-feira, 19 de fevereiro de 2020 16:17
  • Hay un fallo grave en tu codigo.

    Declaras db a nivel de clase, y lo inicializas en la declaracion, con lo que solo se inicializa una vez al construir la instancia de la clase.

    Pero despues, dentro de la clase, tienes un metodo que usa db dentro de un "using". La primera vez que llames al metodo, al salir del mismo se destruira db en el momento de salir del bloque using. Si vuelves a llamar al metodo sobre la misma instancia (que deberia ser permitido, para eso es un metodo de instancia), entonces dara un error debido a que el objeto ya ha sido destruido.

    Solucion: Quita la variable de la clase y declarala dentro del metodo, preferiblemente en el propio "using".

    using (ComunidadContext db = new ComunidadContext()){...}

    Dspues de hacer esto, quita el Dispose de la clase, que ya no vale para nada.

    Si resulta que necesitas usar la misma variable "db" en varios metodos, entonces deja la variable a nivel de clase, y deja el dispose... pero en este caso tienes que quitar el "using" de los metodos.

    quarta-feira, 19 de fevereiro de 2020 17:08
  • Porque realizas dos preguntas iguales

    como Aplicar using(dbContext db = new dbContext) y dispose Entity framework



    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    quarta-feira, 19 de fevereiro de 2020 18:41