C# “LINQ到SQL”;无法访问已处置对象“;例外
当我试图访问从数据库检索到的对象的子对象时,我的代码引发异常。我正在使用LINQtoSQLC# “LINQ到SQL”;无法访问已处置对象“;例外,c#,asp.net,sql-server,linq-to-sql,linq-to-objects,C#,Asp.net,Sql Server,Linq To Sql,Linq To Objects,当我试图访问从数据库检索到的对象的子对象时,我的代码引发异常。我正在使用LINQtoSQL using (var DC = new MyDataContext()) { TimeSlot timeSlot = DC.TimeSlots .Where(w => w.FacilityID == facilityID .OrderByDescending(o => o.LoadDate) .FirstOrDefault(); return tim
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()
,因为我尝试了许多不同的方法,甚至使用我从本博客获得的代码使用投影生成了一个很好的连接:,在Microsoft SQL Server中运行生成的SQL会产生预期的结果,但在我返回之后。但似乎有什么东西在丢弃我的数据,而不是加载数据。我的另一个选择是用一种完全不同的方法返回孩子们。这看起来很傻,因为我的项目中有很多其他方法,我可以抓住一个实体,然后接触到所有其他子实体,而不会出现这些问题。问题是,您试图访问一个尚未加载的属性,但在您已经处理完数据上下文之后。换句话说,在处理与数据库的连接后,您不能查询数据库
你有几个解决方案。要么让数据上下文保持较长时间的活动状态,然后继续延迟加载子项,要么可以在初始查询期间使用强制加载 对。我明白在我处理上下文后无法访问数据。我也读了大约10篇关于变通方法的博客。在LINQ to Entities中,我有Include,但在LINQ to SQL中不存在。另外,调用parent.children.Load()与使用DataLoadOptions()有什么区别吗?使用DataLoadOptions和LoadWith()将在加载父实体时加载子实体,只需一次访问数据库。在之后执行Load()将发出第二个请求以获取数据。性能方面,最好同时加载它们。