Dispose将处置仍被引用的对象?

时间:2015-04-06 05:05:50

标签: 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的所有引用,如果我尝试引用它,我会得到:

  

ObjectContext实例已被释放,无法再使用   对于需要连接的操作。

有时候只会发生这种情况。我做错了吗?

经过深思熟虑:我认为有时候是因为我使用了VS调试器。如果我检查了内容,那么数据就会被枚举。

1 个答案:

答案 0 :(得分:3)

您正在获得该异常,因为当您尝试访问相关的导航属性时,实体框架将尝试使用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类型的相关实例