2009-12-16 50 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