C# 通过使用UseLazyLoadingProxies实现即时加载
我正在创建db连接,如下所示:C# 通过使用UseLazyLoadingProxies实现即时加载,c#,entity-framework,asp.net-core,lazy-loading,ef-core-2.2,C#,Entity Framework,Asp.net Core,Lazy Loading,Ef Core 2.2,我正在创建db连接,如下所示: protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder) { optionbuilder.UseLazyLoadingProxies().UseSqlite(@"Data Source=Data.db"); } 我试图访问这样一个对象: public static User GetProfile(int uid) { using (Db db = ne
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”。
可以通过传递事件ID来抑制或记录此异常
将“CoreEventId.LazyLoadOnDisposedContextWarning”添加到
“DbContext.OnConfiguring”中的“ConfigureWarnings”方法,或
“AddDbContext.”
我理解这意味着什么,但这违背了我对include的理解,以及它是如何导致渴望加载的
我的理解是,当使用include
并通过调用FirstOrDefault
来显式访问对象时,立即加载要填充的相关对象,而无需db连接保持打开状态;但显然,情况并非如此
在不要求数据库保持打开的情况下,正确的方法是什么 Auther V,一位致力于EFC的开发人员已经确认这是一个bug 它在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.lazyloadOnDisposedContextWarnings))代码>行是您需要的
但是请注意,当对封闭的DBContext实例尝试object traveseral时,如果提供空变量,任何不正确的延迟加载用法也将被忽略 执行db.Users.FirstOrDefault(x=>x.UserId==uid)代码>按预期工作?是的,它加载所有直接相关的属性很好,仅当我尝试访问。设置
时,在包含之后,会引发异常。好的!是否db.Users.Include(x=>x.Settings).FirstOrDefault(x=>x.UserId==uid)代码>在删除UseLazyLoadingProxies()
时按预期工作?是的!无需声明UseLazyLoadingProxies()
,即时加载就可以正常工作。这似乎是EF Core中的一个bug,您可以在此处发布问题: