DBContext lazyloadingenabled set to true still loads related entities by default

女生的网名这么多〃 提交于 2019-12-01 18:03:47

问题


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?


回答1:


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




回答2:


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;



回答3:


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.



来源:https://stackoverflow.com/questions/10644590/dbcontext-lazyloadingenabled-set-to-true-still-loads-related-entities-by-default

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!