2009-12-16 5 views
1

오늘 제가 가지고있는 것은 이상한 것입니다.LINQ 2 SQL Query 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; 
    } 

는 SQL 명령을 실행하고 나에게 내가 필요로하는 개체를했다) 내가 이미 ToArray를 (전화 세웠 죠 그리고 난이 DataContext를 인스턴스를 필요가 없습니다 새로운 주문 [] 배열로 제공합니다. 메신저를 직렬화하는 동안 메서드 반환에서 얻을 serializer DataContext 다시 액세스하려고 및 배치 된 개체에 액세스 할 수없는 예외가 발생합니다.

using() 문을 사용하지 않고 사용하려고 시도한 것과 같이 작동해야합니다. 하지만, 왜 이런 행동을합니까? .ToArray()를 호출하고 내용에 새 변수를 할당하는 동안 지연로드가 여전히 남아있는 이유는 누구나 설명을 줄 수 있습니까?

답변

1

Select(p=>p)은 거의 효과가 없습니다. 당신은뿐만 아니라 단지 호출 할 수 있습니다 : 문제가 다시

orders = context.Orders.ToArray(); 

을 - 나도 OrderDetails 정말로드되지 않았 음을 추측 것, 또는 느리게 일부 다른 데이터를로드하기 위해 노력하고있다. 나는 (dev에 세션에서)에 의해 조사 제안이와

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"); 
    } 

을, 당신은Dispose() 이전ToArray하지만 을 happning하는 여분의 데이터베이스 여행을 볼 수 있어야합니다. 요점 :이 데이터는 직렬화에 필요하므로로드가 확보되도록하거나 b : 직렬화에서 제외합니다.

+1

Marc, 고맙습니다. 콘솔 프로젝트 테스트를 피하기 위해 SQL 쿼리를 출력 창에 표시하는 방법을 기억하지 못했습니다. 아직 찾지 못했습니다. P. 그래서 콘솔을 만들었고 당신 말이 맞았고 바보였습니다. OrderDetails 1 - * Product. 답은 LoadWith (od => od.Product)와 모두 좋습니다. 고맙습니다.... –