2013-02-14 4 views
1

다음과 같은 Linq to SQL 구조가 있습니다. "Article"및 "User"클래스가 있습니다. 각 조항에는 판매자 (사용자)가 있으며 각 사용자에게는 많은 조항이 있습니다. 나는 협회와 함께 그것을 해결했다.Linq를 목록의 SQL 연결 객체로 반환

enter image description here

그리고는 나는 모든 기사를 가져오고 목록을 반환하는 방법 읽기()를 가지고있다.

public static List<Article> Read() 
    { 
     using (DataContext dbx = new DataContext()) 
     {  
      return dbx.Article.ToList(); 
     } 
    } 

그래서, 문제는 지금 : 내 프로그램의 아무 곳이나 목록을 사용하고 내가 article.Seller에 액세스 할 때, 나는 다음과 같은 예외 얻을 :

가 삭제 된 개체에 액세스 할 수 없음을

좋아, 내가 목록을 반환하고 DataContext가 폐기되기 때문에 이것은 합법적 인 것처럼 보입니다. 판매자에게 액세스하려면 데이터베이스에서로드되고 폐기 된 DataContext로는 더 이상 가능하지 않습니다.

그래서 지연로드로 해결하고 DeferredLoadingEnabled 속성을 false로 설정하십시오. 판매자를로드하려면 DataLoadOptions을 사용했습니다.

좋아요, 지금까지는 한 단계 만 작동합니다. 이제는 기사에 액세스 할 수 있습니다. 판매자,하지만 그 판매자 (기사. 판매자. 기사)의 다른 기사를 얻으려면 null이됩니다. 그냥 판매자의 기사로 짐을 options.LoadWith<User>(u => u.Articles); 생각했는데 그것은 끝이 없기 때문에 가능하지도 않습니다.

기사 -> 판매자 -> 제품 -> 각 조 판매자 -> 제품 -> 다시 판매자 -> ...

나는 예외를 LoadOptions LoadWith 유형에서 허용되지

사이클을 얻을 그래프.

내가 원했던 것은 첫 번째 방법처럼 올바른 연관 개체가있는 모든 기사를 가져 오는 방법입니다. 연결 개체는 항상 액세스 가능해야하지만 액세스 할 때 데이터베이스에서로드해야합니다.

모든 경우에 DataContext를 사용하면 프로그램에서 목록을 필요로하고 DataContext에서만 목록으로 작업 할 수 있습니다. 그러나 그것은 매우 힘들 것입니다.

내 프로그램의 모든 곳에서 내 Read() 메소드의 코드를 작성하지 않고 연결 객체에 액세스하는 방법을 알고 계십니까?

답변

1

나는 이것도 과거에 보았습니다. 지연된 로딩을 허용하려면 Dispose()으로 전화하지 않는 것이 일반적입니다. 실제로 Dispose()을 호출하는 것은 실제로 필요하지 않습니다.

DataContext에서 Dispose()을 호출할지 여부는 꽤 많이 기록되어 있습니다. 당신은 그것을 훑어보아야 할 것입니다. 그러나 멋진 기사 here이 있습니다.기본적으로 DataContext는 연결 자체를 관리하기 때문에 명시 적으로 처리해야하는 연결이 없습니다.

관련 문제