Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过使用UseLazyLoadingProxies实现即时加载_C#_Entity Framework_Asp.net Core_Lazy Loading_Ef Core 2.2 - Fatal编程技术网

C# 通过使用UseLazyLoadingProxies实现即时加载

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

我正在创建db连接,如下所示:

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,您可以在此处发布问题: