2009-12-16 52 views
1

这一个我今天有一个奇怪的。LINQ 2 SQL查询ObjectDisposed异常

我在装配方法中有这个查询。

 public Order[] SelectAllOrders() 
    { 
     Order[] orders; 
     using (MyDataContext context = new MyDataContext()) 
     { 
      DataLoadOptions dlo = new DataLoadOptions(); 
      dlo.LoadWith<Order>(order => order.OrderDetails); 
      context.LoadOptions = dlo; 

      orders = context.Orders.Select(p => p).ToArray(); 
     } 
     return orders; 
    } 

认为我已经叫ToArray的()SQL命令执行,给我我需要的对象,我给他们一个新的秩序[]数组这应该不需要DataContext的实例。 虽然我序列化从订单[]我从方法返回,串行器试图再次访问DataContext,我得到一个异常,无法访问处置对象。

尝试没有使用()语句,并应该像它应该。但是,为什么我得到这种行为? 任何人都可以解释为什么在我调用.ToArray()并为内容分配新变量时,延迟加载仍然存在?

回答

1

Select(p=>p)实现的很少;你还不如就叫:

orders = context.Orders.ToArray(); 

重的问题 - 我猜,要么OrderDetails还没有真正加载,或者它试图懒洋洋地加载一些其他数据。我建议通过调查(在开发会议):

Order[] orders; 
    using (MyDataContext context = new MyDataContext()) 
    { 
     context.Log = Console.Out; // show me 
     DataLoadOptions dlo = new DataLoadOptions(); 
     dlo.LoadWith<Order>(order => order.OrderDetails); 
     context.LoadOptions = dlo; 
     Console.WriteLine("> Calling ToArray"); 
     orders = context.Orders.ToArray(); 
     Console.WriteLine("> ToArray complete"); 

     // TODO: your extra code that causes serialziation, probably 
     // involving `DataContractSerializer` 

     Console.WriteLine("> Calling Dispose"); 
    } 

有了这个,你应该能够看到正在happning 任何额外的数据库人次ToArrayDispose()之前。重点是:这些数据是序列化所必需的,所以要么a:确保它被加载,要么b:从序列化中排除它。

+1

Marc,thanx for回答,我不记得如何在输出窗口中显示SQL查询以避免Console项目测试,找不到它:P。所以,创建了控制台,你是对的,我愚蠢的忘记了关联OrderDetails 1 - *产品。答案是LoadWith (od => od.Product),它的一切都很好。谢谢.... – 2009-12-16 13:18:09