MySQL + Code First + ¡Problema de carga diferida!

en un programa de bienes raíces muy simple, estoy tratando de enumerar todas las imágenes de una casa usando EF Code Primero adjunto a una base de datos existente que tengo, estoy usando MySQL Conector 6.3.6, aquí está mi código.

namespace CodeFirstMySQL
{
    class Program
    {
        static void Main(string[] args)
        {
            RealEstate db = new RealEstate();

            var houses = (from h in db.Houses
                         select h).Take(10);

            foreach (var house in houses)
            {
                Console.WriteLine(string.Format("Images for {0}", house.Address));
                foreach (Image image in house.Images)
                {
                    Console.WriteLine(string.Format("=> {0}", image.FileName));
                }
            }
        }
    }

    public class RealEstate : DbContext
    {
        public DbSet<House> Houses { get; set; }
        public DbSet<Image> Images { get; set; }
    }

    [Table("CADIMO")]
    public class House
    {
        [Column("CODIGO")]
        public int HouseId { get; set; }

        [Column("ENDERECO")]
        public string Address { get; set; }

        public virtual ICollection<Image> Images { get; set; }
    }

    [Table("CDIMIM")]
    public class Image
    {
        [Key]
        [Column("CODIGO", Order = 0)]
        public int HouseId { get; set; }

        [Key]
        [Column("CODIGO_I", Order = 1)]
        public int ImageOrder { get; set; }

        [Column("FILE_PATH")]
        public string FileName { get; set; }
    }
}

Cuando intento ejecutar esto, aparece el siguiente error:

Imágenes de Porto das Dunas
Excepción no controlada: System.Data.EntityCommandExecutionException: se produjo un error al ejecutar la definición del comando. Consulte la excepción interna para obtener más detalles.
---> MySql.Data.MySqlClient.MySqlException: Ya hay un DataReader abierto asociado con esta conexión que debe cerrarse primero.
en MySql.Data.MySqlClient.MySqlCommand.CheckState ()
en MySql.Data.MySqlClient.MySqlCommand.ExecuteReader (comportamiento CommandBehavior)
en MySql.Data.
--- Fin del seguimiento de la pila de excepciones internas ---

Lo interesante es que si utilizo la siguiente consulta

List<House> houses = (from h in db.Houses select h).Take(10).ToList();

Entonces funciona, pero se ejecuta una carga ansiosa porque cuando verifico la propiedad Imágenes para cada casa, ya están pobladas. Entonces, mi pregunta es, ¿se puede usar Lazy Load con MySQL y Code First?

Sé que Linq no ejecuta la consulta hasta que la usamos, por lo que tal vez el DataReader todavía esté abierto cuando sea el momento de cargar las imágenes de forma diferida y es por eso que está ocurriendo el problema.

Se agradece cualquier luz sobre este tema.

gracias Anderson Fortaleza

preguntado el 10 de mayo de 11 a las 14:05

1 Respuestas

... entonces tal vez el DataReader todavía esté abierto cuando sea el momento de cargar las imágenes de forma diferida y es por eso que el problema está ocurriendo.

Eso es exactamente lo que está sucediendo, pero creo que no es exactamente la razón por la que piensas. El DataReader todavía está abierto, no debido a la ejecución diferida en Linq, sino porque todavía está iterando a través de los resultados de la consulta cuando intenta acceder a la otra propiedad que aún no está cargada. Cuando usted llama .ToList() los resultados se devuelven todos a la vez y se almacenan en un List<TEntity> en la memoria del cliente, en lugar de que se devuelva un registro a la vez.

Puede evitar esto en MS SQL Server usando la configuración MultipleActiveResultSets=true en su cadena de conexión, pero MySQL no admite esta configuración. Sin embargo, lo que debería poder hacer es cargar con entusiasmo los datos adicionales que necesita usando .Include("tablename")

var houses = (from h in db.Houses.Include("Images")
              select h).Take(10);

contestado el 10 de mayo de 11 a las 18:05

Lo suficientemente interesante es que ni siquiera tengo que hacer eso, incluso mi colección de imágenes es una propiedad virtual si llamo a ToList () al final de mi consulta, las imágenes están ansiosas por cargar. No creo que haya una salida a esto con MySQL ya que no es compatible con MultipleActiveResultSets. - Anderson Fortaleza

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.