导航属性未正确加载

use*_*333 9 c# asp.net-mvc entity-framework entity-framework-6

我的上下文如下:

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

    //DbSet properties
}
Run Code Online (Sandbox Code Playgroud)

所以,启用了延迟加载.

我有以下课程:

public class Home
{
    private ICollection<Slide> _slides;

    [Key]
    [Required]
    public string Name { get; set; }

    [ForeignKey("Header")]
    public int? HeaderID { get; set; }

    //Navigation properties
    public ICollection<Slide> Slides
    {
        get { return _slides ?? (_slides = new List<Slide>()); }
        set { _slides = value; }
    }

    public Content Header { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请注意这两个导航性能HeaderSlides使用 virtual关键字.据我所知,当我们不使用virtual关键字时 - 属性应该急切加载.

但是,当我Home从数据库中获取实体时,我的导航属性都是null(但属性HeaderID有值).
即使我切换到this.Configuration.LazyLoadingEnabled = false;- 没有加载的特性 - 他们仍然null.

以下是我从db获取数据的方法(使用存储库模式):

public static Home GetHomeComponent(
    this IRepositoryAsync<Home> repository)
{
   var result = repository
       .Query()
       .Select()
       .First();
   return result;
}
Run Code Online (Sandbox Code Playgroud)

我用Include属性解决了我的问题:

public static Home GetHomeComponent(
    this IRepositoryAsync<Home> repository)
{
   var result = repository
       .Query()
       .Include(x => x.Header)
       .Include(x=>x.Slides)
       .Select()
       .First();
   return result;
}
Run Code Online (Sandbox Code Playgroud)

但是这对我来说不方便(因为我有太多的导航属性要加载).

所以,我的问题是:
使用virtual关键字 - 但为什么我的导航属性没有急切加载?
或者我做错了什么?有没有其他方法加载我的导航属性而不使用Include

jon*_*y89 12

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

这并不意味着您将立即填充实体的所有属性,Slides在您的代码中填充EG,您必须使用.Include() - 这是急切加载,在您使用之前加载属性.

您可以创建一个通用函数,通过它获取的参数填充所需的属性(使用params),请参阅此处了解更多详细信息:

EntityFramework Eager加载所有导航属性