LINQ to SQL“无法访问已释放的对象”异常

本文关键字:释放 对象 异常 访问 SQL to LINQ | 更新日期: 2024-12-05 20:41:00

当我尝试访问从数据库中检索到的对象的子对象时,我的代码抛出异常。我正在使用 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 使用投影生成一个很好的连接:https://eprystupa.wordpress.com/2009/11/26/linq-to-sql-tricks-building-efficient-queries-that-include-reference-data-or-child-entities/,在 SQL Server 中运行生成的 SQL 会产生预期的结果Microsoft但在我返回之后。但似乎有什么东西扔掉了我的数据而不是加载它。我的其他选择是完全以单独的方法返回孩子。这看起来很愚蠢,因为我的项目中还有很多其他方法,我可以抓住一个实体,然后接触到所有其他孩子而没有这些问题。

LINQ to SQL“无法访问已释放的对象”异常

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

您有几个解决方案。要么使数据上下文保持活动状态更长时间,并继续延迟加载子项,也可以使用 LoadWith 在初始查询期间强制加载。