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

标签 c# linq

定义:

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/

相关文章:

c# - 使用 lambda 表达式进行复合选择

c# - LINQ .Where 查询执行时间超过 5 分钟

c# - 不要按属性排序

c# - 如果文件不存在,则删除数据库中的值

c# - 如何为 c#7 元组中的方法参数指定默认值?

c# - 使用 OpenXML 更改段落中的颜色文本

c# - 是否可以使 WcfTestClient 用于自定义传输 channel ?

c# - 在 PCL 中使用 HttpClient 进行异步调用

c# - 组合框数据源绑定(bind)影响由相同数据设置的组合框的其他实例

c# - 所有值的计数均为零的频率表