bretcj7
bretcj7

Reputation: 355

DBContext lazyloadingenabled set to true still loads related entities by default

LazyLoadingEnabled is specifically set to true to prevent the related entities from loading in the context I'm using.

A drug class has a list of drugidentity objects in it.

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

A specific configuration for the class sets the key and hasmany relationship if I wanted to include the related entity to be loaded.

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

When the Drug context is loaded using a linq query the object shows it contains related DrugIdentities when it shouldn't.

context.Configuration.LazyLoadingEnabled = true;

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

drugs[0].DrugIdentities Count = 1

I would expect drugs[0].DrugIdentities to equal NULL since lazyloading was set to true?

Upvotes: 6

Views: 31701

Answers (3)

Roy Liu
Roy Liu

Reputation: 51

It is the very behavior of lazy loading. if you just use the property of drugs, then there will not be any sql to query DrugIdentities. if you use DrugIdentities even just watch it in debug window, then there will be sql to query DrugIdentities and each drug with a single DrugIdentities search query. You can prove the behavior through peeking the sql captured by SQL Profiler. If you want DrugIdentities to be null while querying drug, you may change the model by remove virtual key word before DrugIdentities. Then when you query drug, DrugIdentities will keep null until you load DrugIdentities to context by another query.

Upvotes: 0

bretcj7
bretcj7

Reputation: 355

You have to specifically set ProxyCreationEnabled = false if you want to set LazyLoadingEnabled = true.

The test passed on what I expected. The first query returns the Drugs object and NULL for DrugEntities. Second query returns the DrugEntities since I used the Include to do the eager loading.

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;

Upvotes: 1

tdykstra
tdykstra

Reputation: 6050

To disable lazy loading, set LazyLoadingEnabled to false rather than true. See Lazy, Eager, and Explicit Loading of Related Data in

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

Upvotes: 2

Related Questions