gpt4 book ai didi

c# - Dispose 会处理仍然被引用的对象?

转载 作者:行者123 更新时间:2023-11-30 16:08:21 24 4
gpt4 key购买 nike

定义:

public class A
{
List<B> B { get; set; }
}
public class B
{
public List<C> C { get; set; }
}
public class C
{
public string Name { get; set; }
}

代码:

var model = new A();
DbContext db = new DbContext()
var AllBs = (from b in db.Bs select b).ToList();
model.B = AllBs; //line x
db.Dispose()

在第 x 行,我可以看到 AllBs.C 的所有实例和详细信息。但是,一旦通过 Dispose 行,SOMETIMES model.B 将丢失对 C 的所有引用,如果我尝试引用它,我会得到:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

它只是偶尔发生,而不是经常发生。我做错了什么吗?

经过思考:我认为有时是我使用 VS 调试器造成的。如果我检查了内容,数据就会被枚举。

最佳答案

您会收到该异常,因为当您尝试访问相关的导航属性时, Entity Framework 将尝试使用 DbContext 的连接实例(在延迟加载模式下)填充实例。

在这种情况下你想使用预加载:

var model = new A();
DbContext db = new DbContext()
var AllBs = (from b in db.Bs.Include("C") select b).ToList();
model.B = AllBs; //line x
db.Dispose()

调用 Include将在此处加载 B 类型的实例,并加载类型为 C

的相关实例的集合

关于c# - Dispose 会处理仍然被引用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29465663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com