[英]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.