C# 导航属性未正确加载

C# 导航属性未正确加载,c#,asp.net-mvc,entity-framework,entity-framework-6,C#,Asp.net Mvc,Entity Framework,Entity Framework 6,我的上下文如下所示: public class ApplicationDbContext: IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection") { this.Configuration.LazyLoadingEnabled = true; } //DbSet properties }

我的上下文如下所示:

public class ApplicationDbContext: IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
        this.Configuration.LazyLoadingEnabled = true;
    }

    //DbSet properties
}
我用
Include
properties解决了我的问题:

public static Home GetHomeComponent(
    this IRepositoryAsync<Home> repository)
{
   var result = repository
       .Query()
       .Include(x => x.Header)
       .Include(x=>x.Slides)
       .Select()
       .First();
   return result;
}
公共静态Home GetHomeComponent(
此IRepositoryAsync存储库)
{
var result=repository
.Query()
.Include(x=>x.Header)
.包括(x=>x.Slides)
.选择()
.First();
返回结果;
}
但是这对我来说并不方便(因为我有太多的导航属性要加载)

所以,我的问题是:
我不使用
virtual
关键字-但为什么我的导航属性不急于加载?

还是我做错了什么?有没有其他方法可以在不使用
Include
的情况下加载我的导航属性?

如果您不使用
virtual
关键字,这只意味着一旦您尝试访问非虚拟属性,它将不会从数据库加载,但您将获得
Null

这并不意味着您将立即填充实体的所有属性,要填充
幻灯片
,例如,在您的代码中,您必须使用.Include()-这是急于加载,在使用属性之前自己加载属性

您可以创建一个泛型函数,该函数将通过获取的参数(使用参数)填充所需的属性。有关更多详细信息,请参见此处:


如果你不想懒散加载,为什么要将其设置为true?@jony89,因为我还有许多其他类/属性需要启用懒散加载。我认为
virtual
关键字可以控制我的数据加载方式-懒惰或急切,但由于某种原因它不起作用(我的问题是为什么它不起作用?)。。。顺便说一句,正如我在问题中提到的,甚至切换到
this.Configuration.LazyLoadingEnabled=false
不能解决我的问题-属性仍然返回
null
.Hm。。我刚刚尝试了
公共虚拟内容头{get;set;}
,效果很好!作为结论,我们使用
virtual
关键字指定我们无论如何都要从db加载此属性(懒惰或急切地依赖于
this.Configuration.LazyLoadingEnabled=true/false;
)对吗?是的,virtual关键字提供了两件事:(1)LazyLoading yes或not。。。(2) 它让EntityFramework跟踪您的属性(一旦属性是虚拟的,EF就可以覆盖这些属性),并通过这种方式优化其查询,例如,如果整个实体中只有一个字段被更改,EF将只知道更新此字段,而不是更新整行。
public static Home GetHomeComponent(
    this IRepositoryAsync<Home> repository)
{
   var result = repository
       .Query()
       .Select()
       .First();
   return result;
}
public static Home GetHomeComponent(
    this IRepositoryAsync<Home> repository)
{
   var result = repository
       .Query()
       .Include(x => x.Header)
       .Include(x=>x.Slides)
       .Select()
       .First();
   return result;
}