C# 默认情况下,DBContext lazyloadingenabled设置为true仍会加载相关实体

C# 默认情况下,DBContext lazyloadingenabled设置为true仍会加载相关实体,c#,entity-framework-4.1,C#,Entity Framework 4.1,LazyLoadingEnabled专门设置为true,以防止在我使用的上下文中加载相关实体 drug类中有一个drugidentity对象列表 public class Drug { public virtual List<DrugIdentity> DrugIdentities { get; set; } } 当使用linq查询加载药物上下文时,对象显示它包含相关的药物标识,而它不应该包含相关的药物标识 context.Configuration.LazyLoadingE

LazyLoadingEnabled专门设置为true,以防止在我使用的上下文中加载相关实体

drug类中有一个drugidentity对象列表

public class Drug
{
   public virtual List<DrugIdentity> DrugIdentities { get; set; }
}
当使用linq查询加载药物上下文时,对象显示它包含相关的药物标识,而它不应该包含相关的药物标识

context.Configuration.LazyLoadingEnabled = true;

                    var drugs = from d in context.Drug
                                where d.Active == true
                                select d;
药物[0]。药物标识计数=1


由于lazyloading设置为true,我希望Druges[0]。DrugIdentity等于NULL?

若要禁用延迟加载,请将LazyLoadingEnabled设置为false而不是true。请参阅中的相关数据的延迟、急切和显式加载


如果要设置
LazyLoadingEnabled=true
,则必须专门设置
ProxyCreationEnabled=false

考试通过了我的预期。第一个查询返回
药品
对象和
药品实体
NULL
。第二个查询返回
DrugEntities
,因为我使用了
Include
来进行即时加载

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;

这正是延迟加载的行为。如果您只使用druges的属性,那么将不会有任何sql查询drugIdentity。如果您使用DrugIdentities,甚至只需在调试窗口中查看它,那么将有sql查询DrugIdentities,并使用单个DrugIdentities搜索查询查询每个药物。您可以通过查看sql事件探查器捕获的sql来证明该行为。
如果在查询药物时希望DrugIdentifications为null,可以通过在DrugIdentifications之前删除虚拟关键字来更改模型。然后,当您查询drug时,DrugIdentity将保持null,直到您通过另一个查询将DrugIdentity加载到上下文。

LazyLoadingEnabled设置为true,因为我不希望它急于加载数据。发生的事情是,它在不应该的时候急切地加载相关实体。你怎么知道它是急切地加载?尝试检查导航属性的行为会触发延迟加载。启用延迟加载后,如果要加载相关实体,则无法看到空导航属性。即使在查看对象时,未展开的属性也会显示DrugIdentities属性的计数=1。仅仅通过查看已填充的顶级类,这是否仍然会触发渴望加载?您似乎误解了延迟加载与实际情况相反。延迟加载意味着在访问导航属性时自动加载数据。与此相反的是,当您的关系属性为空时,除非您显式(急切地)加载它们。您的第一条语句不正确。您可以将ProxyCreationEnabled和LazyLoadingEnabled都设置为true。为未来的谷歌用户更正此问题。设置
ProxyCreationEnabled=false
LazyLoadingEnabled=true
对我起到了作用。很抱歉,ProxyCreation不一定要为false才能将LazyLoadingEnabled设置为true。这些是独立的。它是否适用于.net核心?因为我在上下文对象中看不到配置属性!
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;