none
Obtener valor de otra tabla RRS feed

  • Pregunta

  • Hola, tengo un problema con la cual llevo tiempo queriendo resolver.

    Tengo un DataGridView el cual lo lleno con registros de una tabla "Socios" de la base de datos SQL.

    Estoy utilizando EntityFramework.

    Este es el código con el que intento llenar el DGV.

    try
                {
                    dgvSocios.Rows.Clear();
                    clsSocios socio = new clsSocios();
                    List<Socio> lista = socio.ListarSocios();
                    foreach (Socio i in lista)
                    {
                        dgvSocios.Rows.Add(i.IdSocio.ToString(), i.Nombre.ToString(), i.Apellido.ToString(), i.Direccion.ToString(), i.Localidad.Localidad1.ToString(), i.DNI.ToString(), i.Email.ToString(), i.FechaNac.Value, i.Telefono.ToString());
                    }           
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

    En una clase:

           public List<Socio> ListarSocios()
            {
                using (BDClubEntities BD = new BDClubEntities())
                {
                    return BD.Socio.ToList();
                }
            }

    El error ocurre cuando tiene que agregar la "Localidad" de un "Socio", el mensaje de error es "Referencia a objeto no establecida como instancia de un objeto"

    El "socio" tiene asignado un numero de localidad el cual existe, los campos restantes si me trae los datos correctamente.

    Espero me puedan ayudar, saludos!



    sábado, 1 de septiembre de 2018 19:40

Respuestas

  • Una primera observación: pusiste la pregunta en el foro de C++ pero en realidad el código que muestras es C#.

    Dicho eso, el problema está en que cuando sales del método ListarSocios se abandona el bloque "using" y eso ocasiona que se cierre el contexto BDClubEntities, por lo que ya no puedes acceder a los miembros de la clase socio que se encuentran relacionados en base de datos pero ya no tienes la conexión disponible para acceder a ellos.

    Una primera solución es subir el "using" a la rutina en la que accedes a Localidad (y pasárselo como argumento a ListarSocios). Esta es la mejor solución si solo vas a necesitar algunas localidades de algunos socios.

    Otra solución es usar un ".Include" en ListarSocios para que se carguen en memoria todas las localidades de todos los socios. Esta es la mejor solución si necesitas todas las localidades en lugar de solo unas pocas:

    return BD.Socio.Include(s => s.Localidad).ToList();

    • Marcado como respuesta Federico32113 domingo, 2 de septiembre de 2018 15:32
    domingo, 2 de septiembre de 2018 14:49

Todas las respuestas

  • Una primera observación: pusiste la pregunta en el foro de C++ pero en realidad el código que muestras es C#.

    Dicho eso, el problema está en que cuando sales del método ListarSocios se abandona el bloque "using" y eso ocasiona que se cierre el contexto BDClubEntities, por lo que ya no puedes acceder a los miembros de la clase socio que se encuentran relacionados en base de datos pero ya no tienes la conexión disponible para acceder a ellos.

    Una primera solución es subir el "using" a la rutina en la que accedes a Localidad (y pasárselo como argumento a ListarSocios). Esta es la mejor solución si solo vas a necesitar algunas localidades de algunos socios.

    Otra solución es usar un ".Include" en ListarSocios para que se carguen en memoria todas las localidades de todos los socios. Esta es la mejor solución si necesitas todas las localidades en lugar de solo unas pocas:

    return BD.Socio.Include(s => s.Localidad).ToList();

    • Marcado como respuesta Federico32113 domingo, 2 de septiembre de 2018 15:32
    domingo, 2 de septiembre de 2018 14:49
  • Gracias por la respuesta, pude implementar la segunda opción y funciono perfecto.
    domingo, 2 de septiembre de 2018 15:32