2012-05-17 12 views
5

LazyLoadingEnabled se establece específicamente en true para evitar que las entidades relacionadas se carguen en el contexto que estoy usando.DBContext lazyloadingenabled establecido en true todavía carga entidades relacionadas de forma predeterminada

Una clase de medicamento tiene una lista de objetos con identidad de fármaco.

public class Drug 
{ 
    public virtual List<DrugIdentity> DrugIdentities { get; set; } 
} 

Una configuración específica para la clase establece la clave y tiene una gran relación si deseo incluir la entidad relacionada a cargar.

public DrugConfiguration() 
    { 
     this.HasKey(d => d.DrugID); 
     this.HasMany(d => d.DrugIdentities).WithOptional(d => d.Drug).Map(d => d.MapKey("DrugID")); 
    } 

Cuando el contexto de Drogas se carga mediante una consulta linq el objeto muestra que contiene DrugIdentities relacionados cuando no debe.

context.Configuration.LazyLoadingEnabled = true; 

        var drugs = from d in context.Drug 
           where d.Active == true 
           select d; 

drogas [0] .DrugIdentities Count = 1

que esperaría drogas [0] .DrugIdentities a la igualdad de NULL desde lazy loading estaba en true?

+6

Parece que no entiende bien la carga diferida como lo opuesto a lo que realmente es. La carga lenta significa que sus datos ** se ** cargan automáticamente cuando accede a una propiedad de navegación. El ** opuesto ** de esto, carga ansiosa, es cuando obtienes nulos para tus propiedades de relación a menos que las cargues explícitamente (ansiosamente). –

Respuesta

3

Para deshabilitar la carga diferida, establezca LazyLoadingEnabled en falso en lugar de verdadero. Ver perezoso, ansioso, y carga explícita de datos relacionados con en

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

+0

LazyLoadingEnabled está establecido en verdadero porque no quiero que cargue con impaciencia los datos. Lo que está sucediendo es que está ansioso por cargar las entidades relacionadas cuando no debería ser así. – bretcj7

+0

¿Cómo sabes que está ansioso por cargar? El simple acto de intentar inspeccionar una propiedad de navegación desencadena la carga diferida. Con la carga diferida no puede ver una propiedad de navegación nula si hay entidades relacionadas para cargar. – tdykstra

+0

Incluso cuando se ve el objeto, la propiedad sin expandirlo muestra un Recuento = 1 para la propiedad DrugIdentities. ¿Eso todavía activará la carga ansiosa simplemente mirando la clase de nivel superior que se llena? – bretcj7

2

usted tiene que fijar específicamente ProxyCreationEnabled = false si desea establecer LazyLoadingEnabled = true.

La prueba pasó en lo que esperaba. La primera consulta devuelve el objeto Drugs y NULL para DrugEntities. La segunda consulta devuelve el DrugEntities ya que utilicé el Include para realizar la carga ansiosa.

var queryDrug = from d in context.Drug 
           where d.Active == true 
           select d; 

       var drugresults = from d in context.Drug.Include(e => e.DrugIdentities) 
            where d.Active == true 
            select d; 
+9

Su primera afirmación no es correcta. Puede hacer que ProxyCreationEnabled y LazyLoadingEnabled se establezcan en verdadero. Corrigiendo esto para futuros Googlers. – onefootswill

+1

Estableciendo 'ProxyCreationEnabled = false' y' LazyLoadingEnabled = true' me funcionó. –

+0

lo siento pero ProxyCreation no tiene que ser falso para establecer LazyLoadingEnabled en verdadero. Estos son independientes. – MemeDeveloper

Cuestiones relacionadas