none
trabajo con los objetos DBContext RRS feed

  • Pregunta

  • Estoy haciendo una aplicación con EntityFramework Code First, y a través de la creación de objetos contexto de clases que hereden de DBContext y de sus DbSets realizo todas las operaciones de Base de datos, pero mi consulta es si me recomendéis que cree un único objeto contexto para toda la aplicación, o si debo crear un objeto y cerrarlo mediante

     public IEnumerable<Clientes>ListaClientes(){   

          IEnumerable<Clientes> MisClientes=null;  

           using (var contexto = new Contexto()){ 

                MisClientes = Contexto.DbSetClientes;

              } 

         return MisClientes;

    }

    ya he probado con ambas formas, pero en la primera obtengo errores que me dicen que existen DataReader abiertos y algunas operaciones no se realizan, mientras que con el segundo, aparte de que la página se eterniza, pierdo los valores recuperados de la función con un mensaje de que ya no existen valores al haberse cerrado el origen de datos.

    Me podríais ayudar a elegir la forma y si conocéis un tutorial que me aclare la reglas de como se trabaja con Linq y EntityFramework en cuanto a aperturas, cierres etc.

    gracias por adelantado

      

    jueves, 9 de enero de 2014 0:01

Todas las respuestas

  • >>pero en la primera obtengo errores que me dicen que existen DataReader abiertos

    what ? pero si usas entity framework que tiene que ver los datareader

    yo suelo usar repositorios para implementar las operaciones

    [Entity Framework][Code First] Crear entidad simple

    en ese repositorio aplico la tecnica de definir el contexto en cada operacion, se que hay veras que al instanciar el repositorio lo define global para el mismo, pero de ambas formas deberia funcionar igualmente

    igualmente alli veo algo raro, porque defines

     Contexto.DbSetClientes;

    o sea estas creando un

    public DbSet<Cliente> DbSetClientes {get; set;}

    en la clase de contexto ?

    porque no solo haces

    public IEnumerable<Clientes> ListaClientes(){   
    
    	using (var contexto = new Contexto()){ 
    
    		return Contexto.DbSetClientes.ToList();
    
    	 } 
    
    }

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 9 de enero de 2014 11:41
  • Si se que los DataReader son de ADO 2.0 y que su comportamiento era de bloqueo mientras se mantenía abierto, pero lo cierto es que la aplicación me genera un error que me indica la existencia de un DataReader abierto cuando intento resolver una cuestión ficticia como la siguiente:

      - necesito localizar una colección de los pintores de una zona de España y que el método devuelva dicha colección y que para cada uno de los pintores se incluya su colección de cuadros.

    -  para la primera operación genero una sentencia Linq que me devuelve la colección de Pintores en ColPintores

    - para localizar los cuadros creo un bucle foreach que localiza los cuadros de cada pintor, sería algo como

      foreach (var P in ColPintores) {

           P.ListaCuadros = contexto.DbSetCuadros.Where(x=> x.PintorId == P.PintorID)

       }

    y en esa segunda sentencia es cuando dice que hay un DataReader abierto, por lo que he visto tiene que ver con le ejecución diferida de Linq, pero no quiero aplicar el ToList() a todo, me satura la memoria.

    un saludo

     

    jueves, 9 de enero de 2014 19:38
  • Te envío el código de error que me genera para que veas que aunque no sea ADO 2.0 siguen existiendo los DataReaders etc. Ahora lo voy a resolver por otro lado que tiene que ver con comandos con múltiples conexiones, el código devuelto del error es:

    Ya hay un DataReader abierto asociado a este Command, debe cerrarlo primero.

    Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código. 

    Detalles de la excepción: System.InvalidOperationException: Ya hay un DataReader abierto asociado a este Command, debe cerrarlo primero.

    Error de código fuente: 
    Línea 316:            //using (DB = new Contexto())
    Línea 317:            //{
    Línea 318:                return DB.MisFotos.Where(x => x.OfertaId == Id).ToList();
    Línea 319:            //}
    Línea 320:        }

    un saludo

    jueves, 9 de enero de 2014 22:55