簡體   English   中英

快速加載包括使用 UseLazyLoadingProxies

[英]Eager loading include with using UseLazyLoadingProxies

我正在像這樣創建數據庫連接:

protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
{
    optionbuilder.UseLazyLoadingProxies().UseSqlite(@"Data Source=Data.db");
}

我正在嘗試訪問這樣的對象:

public static User GetProfile(int uid)
{
    using (Db db = new Db())
    {
        return db.Users.Include(x => x.Settings).FirstOrDefault(x => x.UserId == uid);
    }
}

用戶對象如下:

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public string Name { get; set; }
    public DateTime? LastUsed{ get; set; }

    public virtual Setting Settings { get; set; }
}

但是在訪問Users.Settings ,它會引發以下錯誤:

'為警告'Microsoft.EntityFrameworkCore.Infrastructure.LazyLoadOnDisposedContextWarning 生成錯誤:在處理關聯的DbContext 后,嘗試延遲加載實體類型'UserProxy' 上的導航屬性'Settings'。'。 可以通過將事件 ID 'CoreEventId.LazyLoadOnDisposedContextWarning' 傳遞給 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法來抑制或記錄此異常。

我理解這意味着什么,但這違背了我對包含以及它如何導致急切加載的理解。

我的理解是,當使用include並通過調用FirstOrDefault顯式訪問對象時,立即加載要填充的相關對象,而無需 db 連接保持打開狀態; 但顯然,情況並非如此。

不需要數據庫保持打開狀態的正確方法是什么?

從事 EFC 工作的開發人員 Auther V 已確認這是一個錯誤。

https://github.com/aspnet/EntityFrameworkCore/issues/15170

有關此更改的文檔

它在 EF Core 3.0.0 RC4 中得到修復,但在撰寫本文時,在公共領域中不可用。 我個人不建議使用 RC4,因為它仍在開發中,不太適合通用或生產用途。

現在,您可以像這樣抑制錯誤:

protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
{
    optionbuilder.UseSqlite(@"Data Source=Data.db").UseLazyLoadingProxies();
    optionbuilder.ConfigureWarnings(w => w.Ignore(CoreEventId.LazyLoadOnDisposedContextWarning));
}

optionbuilder.ConfigureWarnings(w => w.Ignore(CoreEventId.LazyLoadOnDisposedContextWarning)); 線是你需要的。

但請注意,當嘗試對已關閉的 DBContext 實例進行對象遍歷時,延遲加載的任何不當使用也將被忽略,從而提供空變體。

暫無
暫無

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

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