2010-06-14 5 views
1

내 웹 호스트에 Framework 4.0이 아직 없기 때문에 EF 버전 1에서 엔터티 데이터 모델을 작성해야합니다. 아래는 문제를 보여주는 간단한 예입니다.Entity Framework v.1의 외래 키 관계

나는 3 개의 테이블, 1 개의 Users 테이블, 다른 Webpages 테이블 및 방문이있는 테이블을 가지고 있습니다. 앞의 두 테이블은 Visits 테이블과 일대 다 관계를 가지고 있습니다 (기본적으로 다 대다 관계로 작동하며 Visits 테이블에는 고유 기본 키와 추가 필드가 있습니다)

4.0 버전이 작동하지만 v.1에서는 작동하지 않습니다. "방문수"의 수가 0이므로 테스트 문자열은 ""을 반환합니다 ... 이유는 무엇이며 어떻게 v.1의 외래 키 릴레이션에 액세스 할 수 있습니까?

UsersEntities context = new UsersEntities(); 
var users = context.Users; 
string result = ""; 
foreach (var user in users) 
{ 
    foreach (var visit in user.Visits) 
    { 
     result += visit.Webpage.Url + "\n"; 
    } 
} 

는 그래서 foreach 루프는 확인을 얻는 사용자를 통해 루프하지만, 반환에는 방문이 없기 때문에 내부 루프는 입력하지 않습니다. 다시, Framework 4.0에서는 동일한 데이터베이스를 사용하여 정상적으로 작동합니다.

무엇이 잘못 되었나요?

답변

2

간단히 여기에 코드를 변경 :

UsersEntities context = new UsersEntities(); 
var users = context.Users.Include("Visits"); 
string result = ""; 
foreach (var user in users) 
{ 
    foreach (var visit in user.Visits) 
    { 
     result += visit.Webpage.Url + "\n"; 
    } 
} 

알림이 (가) (...) 포함 간절히 각 사용자의 방문을로드 EF을 알 수있다.

그걸로 작동합니다. 웹 페이지를 탐색 너무 경우

사실, 당신이해야 할 수 있습니다

Include("Visits.Webpage"); 

희망이

+0

좋아요 작동! 고마워, 고마워! 몇 가지 질문 : 이것이 필요한 이유는 무엇입니까? Linq에서 Sql이 필요하지 않고 v.4.0이 아니기 때문에 4.0에서 수정되었거나 "Include"의 목적이 무엇입니까? 또한 이와 같은 데이터 모델을 탐색 할 때 많은 단계 ("점")를 필요로하는 객체를 가로 질러 트래버스해야합니다. 나는 최소한의 지식의 원리, 또는 당신이 이것을 피해야한다고 말하는 "Demeter의 법칙"을 생각하고 있습니다. 이게 문제 야? 그렇지 않으면 어떻게해야하는지 모르겠다. (디자인 원리에 대해 더 많이 배우려고하기 때문에 물어 본다.) – Anders

+0

L2S에서 네비게이션에 액세스하면 자동으로로드됩니다 - 일명 lazyloading. Demeter의 법률에 관해서는, 나는이 위반을 피하기 위해 네비게이션을 무너 뜨릴 수있는 ORM을 아직 보지 못했습니다. x.Y.Z 대신 x.YZ –

+0

사전에 데이터가 필요하다는 것을 알고있을 때 Include를 사용하면 많은 결과를 되돌릴 때 유용하며 일부 결과에서만 관련 항목이 필요할 수 있습니다. 나는. 모든 데이터를 앞쪽으로 끌어 당기는 것은 낭비입니다. –

관련 문제