Reputation: 355
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
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
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
Reputation: 6050
To disable lazy loading, set LazyLoadingEnabled to false rather than true. See Lazy, Eager, and Explicit Loading of Related Data in
Upvotes: 2