【问题标题】:LINQ to SQL "cannot access disposed object" exceptionLINQ to SQL“无法访问已处置的对象”异常
【发布时间】:2015-03-13 20:40:15
【问题描述】:

当我尝试访问从数据库中检索到的对象的子对象时,我的代码抛出异常。我正在使用 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在 Microsoft SQL Server 中产生了预期的结果,但在我返回之后。但似乎有些东西正在丢弃我的数据而不是加载它。我的其他选择是完全以单独的方法返回孩子。虽然这看起来很愚蠢,因为我的项目中有很多其他方法,我可以抓住一个实体,然后在没有这些问题的情况下联系所有其他孩子。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 对。我了解在处理完上下文后我无法访问数据。我也阅读了大约 10 篇关于解决方法的博客。在 LINQ to Entities 我有 Include 但在 LINQ to SQL 中不存在。
    • 另外,调用 parent.children.Load() 与使用 DataLoadOptions() 有什么区别吗?
    • 使用 DataLoadOptions 和 LoadWith() 将在加载父实体时加载子实体,一次访问数据库。之后执行 Load() 将发出第二个请求以获取数据。在性能方面,最好同时加载它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2011-10-23
    • 2011-03-25
    相关资源
    最近更新 更多