none
error system.objectdisposedexception "The ObjectContext instance has been disposed and can no longer be used for operations that require a connection RRS feed

  • Pregunta

  • Hola a todos, alguien me puede ayudar por favor. tengo dos tablas barrios y localidades y quiero relacionar un barrio con su localidad, codigo:

    public void AgregarBarrio (string nombreBarrio, int idLocalidad)
            {

                
                DLocalidades loc = new DLocalidades();
                
                using (DBSeminarioEntities db = new DBSeminarioEntities())
                {
                    var ba = new Barrios()
                    {
                        Nombre = nombreBarrio,
                        
                    };

                    db.Barrios.Add(ba);
                    var lo = loc.BuscarLocalPorID(idLocalidad);
                    
                    lo.Barrios.Add(ba); En esta linea me sale el error " system.objectdisposedexception "The ObjectContext instance                                                          has been disposed and can no longer be used for operations that require a connection"
                    lb.SaveChanges();
                }
                
            } Desde ya muchas gracias. 

    miércoles, 19 de junio de 2019 13:57

Respuestas

  • Fíjate que la variable "lo" proviene de una subrutina llamada "BuscarLocalidadPorId". Si esa subrutina está escrita más o menos de manera similar a la que nos has mostrado en tu pregunta, entonces internamente tiene un "using" que construye el dbcontext, lo usa, y luego sale, por lo que se hace el Dispose de ese DBContext. La variable "lo" que nos devuelve está vinculada a ese DBContext interno del que se acaba de hacer Dispose porque hemos salido del using que lo construía. Entonces llamas a lo.Barrios. Ese "Barrios" es seguramente una tabla relacionada con la de localidades mediante un foreign key. Cuando accedes, EF usa el DBContext para seguir el FK y acceder a la tabla relacionada. Pero en este momento ese DBContext que se tiene que usar para acceder a Barrios ya ha sido destruido, por lo que sale el error que estás viendo.

    La solución más común es la de añadir .Include("Barrios") en la query que haya dentro de BuscarLocalPorID. Eso hace que la lista de barrios se construya y almacene en memoria en el momento de ejecutar la query, mientras todavía está abierto el DBContext. Pero en tu caso te dará problemas, porque le haces un Add que tiene que ejecutarse al hacer el SaveChanges, y eso también requeriría el DBContext abierto, con lo que te volverá a salir el mismo error en la siguiente línea. Tendrás que reestructurar el código para que no se dé esta situación de acceder a propiedades virtuales de un objeto que se obtuvo desde un dbcontext ya destruído.

    miércoles, 19 de junio de 2019 15:33

Todas las respuestas

  • Fíjate que la variable "lo" proviene de una subrutina llamada "BuscarLocalidadPorId". Si esa subrutina está escrita más o menos de manera similar a la que nos has mostrado en tu pregunta, entonces internamente tiene un "using" que construye el dbcontext, lo usa, y luego sale, por lo que se hace el Dispose de ese DBContext. La variable "lo" que nos devuelve está vinculada a ese DBContext interno del que se acaba de hacer Dispose porque hemos salido del using que lo construía. Entonces llamas a lo.Barrios. Ese "Barrios" es seguramente una tabla relacionada con la de localidades mediante un foreign key. Cuando accedes, EF usa el DBContext para seguir el FK y acceder a la tabla relacionada. Pero en este momento ese DBContext que se tiene que usar para acceder a Barrios ya ha sido destruido, por lo que sale el error que estás viendo.

    La solución más común es la de añadir .Include("Barrios") en la query que haya dentro de BuscarLocalPorID. Eso hace que la lista de barrios se construya y almacene en memoria en el momento de ejecutar la query, mientras todavía está abierto el DBContext. Pero en tu caso te dará problemas, porque le haces un Add que tiene que ejecutarse al hacer el SaveChanges, y eso también requeriría el DBContext abierto, con lo que te volverá a salir el mismo error en la siguiente línea. Tendrás que reestructurar el código para que no se dé esta situación de acceder a propiedades virtuales de un objeto que se obtuvo desde un dbcontext ya destruído.

    miércoles, 19 de junio de 2019 15:33
  • Muchas gracias por tu respuesta, solucioné el problema
    jueves, 20 de junio de 2019 12:31