LINQ to SQL“无法访问被处置对象”异常

时间:2015-03-13 20:40:15

标签: c# asp.net sql-server linq-to-sql linq-to-objects

当我尝试访问从数据库中检索到的对象的子代时,我的代码抛出异常。我正在使用LINQ to SQL。

using (var DC = new MyDataContext())
{

    TimeSlot timeSlot = DC.TimeSlots
    .Where(w => w.FacilityID == facilityID
    .OrderByDescending(o => o.LoadDate)
    .FirstOrDefault();

    return timeSlot;

}

// Much later...
var slotChildren = timeSlot.children; // EXCEPTION!! Cannot access a disposed object.

我能够完成这项工作的唯一方法是强制加载timeSlotForDay.LMSTimeSlotHours.Load(),但这感觉很麻烦。我有一个预感,其中一个主要问题是.FirstOrDefault(),因为我尝试了许多不同的东西,甚至使用我从这个博客获得的代码http://pastie.org/private/zzb01oeimkpelqz14gi7q使用投影产生一个很好的连接:{{3}在Microsoft SQL Server中运行生成的SQL会产生预期的结果,但是在我返回之后。但似乎有些东西丢弃了我的数据而不是加载它。我的其他选择是完全以单独的方式让孩子们回归。这看起来很愚蠢,因为我的项目中有很多其他方法,我可以抓住一个实体,然后在没有这些问题的情况下联系所有其他孩子。

1 个答案:

答案 0 :(得分:1)

问题是您正在尝试访问尚未加载的属性,但是在您已经处理完数据上下文之后。换句话说,在丢弃与数据库的连接后,无法查询数据库。

你有几个解决方案。保持数据上下文的存活时间更长,并继续延迟加载子项,或者可以使用LoadWith在初始查询期间强制加载。