簡體   English   中英

導航屬性未正確加載

[英]Navigation properties not loading properly

我的上下文如下:

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

    //DbSet properties
}

所以,啟用了延遲加載。

我有以下課程:

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; }
}

請注意,導航屬性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;
}

我用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;
}

但是這對我來說不方便(因為我有太多的導航屬性要加載)。

所以,我的問題是:
使用virtual關鍵字 - 但為什么我的導航屬性沒有急切加載?
或者我做錯了什么? 有沒有其他方法加載我的導航屬性而不使用Include

如果你不使用virtual關鍵字,它只意味着一旦你嘗試訪問非虛擬屬性,它將不會從數據庫加載,但你會得到一個Null

這並不意味着你將立即填充實體的所有屬性,在你的代碼中填充Slides for EG,你必須使用.Include() - 這是急切的加載,在你之前加載你自己的屬性用過的 。

您可以創建一個通用函數,通過它獲取的參數填充所需的屬性(使用params),請參閱此處了解更多詳細信息:

EntityFramework Eager加載所有導航屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM