Pregunta La configuración LazyLoadingEnabled no parece funcionar en EF 5


Estoy usando EF Model primero con entidades POCO y con DbContexts personalizados. Mi problema es que el ajuste LazyLoadingEnabled=false No afecta nada, las propiedades de navegación todavía están cargadas. Debajo está mi ejemplo simplificado.

La entidad Programa. Un programa puede ser parte de otros programas:

namespace Domain.Entities
{
    using System;
    using System.Collections.Generic;

    public partial class Program
    {
        public Program()
        {
            this.Programs = new HashSet<Program>();
        }

        public int Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public System.DateTime StartDate { get; set; }
        public System.DateTime EndDate { get; set; }
        public Nullable<int> ProgramId { get; set; }

        public virtual ICollection<Program> Programs { get; set; }
        public virtual Program OwnerProgram { get; set; }
    }
}

El DbContext:

namespace Infrastructure.Model
{
    public class ProgramContext : DbContext
    {
        public ProgramContext()
            : base("name=MyContainer")
        {
            Configuration.LazyLoadingEnabled = false;
        }

        public DbSet<Program> Programs { get; set; }
    }
}

Así es como lo uso:

private ProgramContext _dbContext = new ProgramContext();

// GET api/program
public IEnumerable<Program> GetPrograms()
{
    List<Program> list = _dbContext.Programs.ToList();
    return list;
}

Con el ejemplo anterior, EF aún carga las propiedades Programas y Programas de Propietarios de la clase de Programas. He intentado eliminar las palabras clave virtuales, deshabilitando la creación del proxy y también he verificado que LazyLoadingEnabled=false en el modelo en sí.

¿Me estoy perdiendo de algo?


5
2018-05-03 10:49


origen


Respuestas:


El efecto que estás viendo se llama corrección de relaciones.

En realidad, las propiedades de navegación son no cargado explícitamente La consulta _dbContext.Programs.ToList() solo carga todo Programs tabla de la base de datos. Esto es solo una simple consulta SQL (como SELECT * FROM ProgramsTable) sin ningún WHERE cláusula y sin ninguna JOIN a filas relacionadas.

Además, no se produce ninguna carga diferida aquí (realmente no se puede si se deshabilita y si se deshabilitan incluso los proxies dinámicos) cuando se accede al program.Programs y program.OwnerProgram Propiedades de navegación.

Las propiedades de navegación se rellenan cuando el resultado de su consulta se materializa porque su consulta (que carga todas programas) habrá cargado todos los programas a los que se pueden referir las propiedades de navegación. EF detecta que esas entidades relacionadas ya están en la memoria y las coloca en las propiedades de navegación automáticamente.

Puede verificar esto si no carga todas Programas pero solo, por ejemplo, uno solo:

Program program  = _dbContext.Programs.FirstOrDefault();

Ahora, program.Programs y program.OwnerProgram estarán null - a menos que el cargado program es parte de su propio program.OwnerProgram colección o es su propia OwnerProgram.


6
2018-05-04 14:05



"EF sigue cargando los programas y las propiedades del programa propietario del programa   clase"

Este es el comportamiento correcto, pero en lugar de cargar las propiedades de navegación perezosamente, las carga con entusiasmo.

Esto significa que las consultas de la base de datos requeridas para recuperar los valores de las propiedades de navegación se ejecutan inmediatamente cuando el Program La entidad se recupera y las propiedades de navegación se rellenan.

Cuando LazyLoadingEnabled se establece en true estas consultas no se activan hasta que intente acceder a las propiedades de navegación. Esto también se aplica a cuando coloca el mouse sobre las propiedades de navegación y se adjunta el depurador, lo que puede llevarlo a pensar que las entidades no están cargadas de forma perezosa cuando de hecho lo están: el depurador está accediendo a la propiedad de navegación, por lo Entity Framework lo carga.

Puede ejecutar un generador de perfiles SQL como éste para ver exactamente cuándo se activan las consultas a medida que depura el código.


2
2018-05-04 12:34



Con el ejemplo anterior, EF todavía carga los Programas y el Programa de Propietarios   propiedades de la clase de programa. He intentado eliminar el virtual   palabras clave, deshabilitando la creación de proxy y también verificó que   LazyLoadingEnabled = false en el propio modelo.

¿Me estoy perdiendo de algo?

Debe eliminar el constructor predeterminado que inicializa estas propiedades.


0
2018-05-04 12:41