4

Include() 메서드를 사용하여 여러 엔터티 (열망하는로드)를 반환하는 데 문제가 있습니다. RIA 서비스를 사용하는 실버 라이트 애플리케이션에서 엔트리를로드하려고합니다. 데이터 모델은 다음과 같은 관계로 구성 RIA Services 도메인 서비스를 사용하여 EF4에 Include()를 포함하지 않았습니다!

Events.ID = EventParticipants.EventsID
EventParticipants.ParticipantUserID = Users.ID

그래서 이벤트는 많은 참가자를 가질 수 있고 참가자는 정확히 1 사용자입니다.

이벤트를 제대로로드 할 수 있지만 이 Include() 문의 지정된 자식 관계에서 벗어날 수 없습니다.

이벤트를로드 할 때 모든 EventParticipant 및 관련 사용자 레코드를 끌어들이려고합니다.

public IQueryable<Event> GetEvents() 
    { 
     return this.ObjectContext.Events     
        .Include("EventParticipants") 
        .Include("EventParticipants.User"); 

    } 

그때 반환이라는 된 IQueryable을 가지고 있으므로 같은 클라이언트 측에서 내 도메인 컨텍스트를 사용하여로드 :

DomainContext.Load(DomainContext.GetEventsQuery(), LoadOperationCompleted, true); 

(일반적으로 I 필터링 할 내 도메인 서비스에서 나는 다음과 같은이 이 문제의 핵심에 이르기까지 모든 것을 단순화했습니다.)

내 LoadOperationCompleted에는 이벤트 참가자가 반환되었지만 쿼리에서 참가자를받지 못한 것을보기 위해 사용하는 2 개의 루프가 있습니다. (데이터베이스에, 나는 참가자가 모두 정의 (242 개) 이벤트 ...이)

private void LoadOperationCompleted(LoadOperation lo) 
    { 

     if (lo.Error != null) 
     { 
      Debugger.Break(); 
      lo.MarkErrorAsHandled(); 
     } 

     foreach (Event item in lo.Entities) 
     { 

      foreach (var particpant in item.EventParticipants) 
      { 
       Debug.WriteLine("{0} {1}", particpant.User.First, particpant.User.Last); 
      } 

     } 

    } 

내가 대신 엔티티 모음의 원래 도메인 컨텍스트를 통해 회전하는 위의 코드 (아래 참조)를 수정 한 것을 로드 조작 매개 변수를 통해 전달되지 않습니다. 다양한 매개 변수 세 가지 생성자 (모든 생성)가, 내 데이터 모델에서

foreach (Event item in DomainContext.Events) 

을 (이벤트는 아이들이 아니다,있다). DataModel.edmx의 XML 표현에 주석이 있었다

this.ContextOptions.LazyLoadingEnabled = false; 

: 각에서 나는 장애인 게으른 로딩과 같이 있습니다. 나는이 세대 목적으로 만 생각 ...하지만 너무과 같이 것으로 변경 :

<EntityContainer Name="MyCrazyEntities" annotation:LazyLoadingEnabled="false"> 

내 SQL 서버 2008 데이터베이스에 관계를 정의했습니다. 설계자가이를 선택하고 내 모델에서 모든 관계 및 탐색 속성을 만들었습니다. 그것들을 검사하면, 그들은 유효한 것처럼 보입니다. include 문에서 엔티티의 철자를 굵게 쓰면 경로가 유효하지 않음을 알리는 오류가 발생합니다. 그래서 관계가 존재하고 기능적이라고 믿습니다. (그리고 나는 그 정의를 볼 수 있습니다. 디자이너 코드와 이것 저것에서).

모든 필터링과 특히 발행하기 전에 쿼리에 추가 한 조인을 제거했습니다. 이것은 쿼리의 모양을 변경하고 Includes()를 위반하는 조인 문제가 발생하지 않도록하기위한 것입니다. 사람들에게 커다란 문제로 보입니다. 문제를 분리하기 위해 이런 방식으로 모든 조인을 제거했습니다. 조인과 포함의 조합은 아닙니다.

저는 도메인 서비스와 RIA 서비스 DLL을 보유하고있는 실버 프로젝트를 몇 번이나 재구성했습니다. 몇 가지 설정이 잘못되었다고 생각합니다. POCO 클래스 생성기를 EF와 함께 사용했지만 POCO와 동일한 방법을 사용할 수 없다는 것을 읽었습니다 ... 그래서 역시 폐기했고 기본 엔티티 생성기로 돌아갔습니다.

SQL Server 프로파일 러를 시작하고 기본 쿼리와 Includes()를 사용하여 SQL을 캡처했습니다. Include 에 대한 데이터는으로 반환됩니다. 프로파일 러에서 쿼리를 복사하고 직접 발행하여이를 확인했습니다. 쿼리의 단순화 된 버전은 다음과 같습니다. 관계는 유효하고 나는 모든 관련 데이터가 (등 즉, 참가자 이름, 전화 번호,) 그러나

SELECT 
'trimmed fields for brevity>' 
FROM (SELECT 
    'trimmed fields for brevity>' 
    CASE WHEN ([Join1].[ID1] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1] 
    FROM [dbo].[Events] AS [Extent1] 
     LEFT OUTER JOIN (SELECT 'trimmed fields for brevity>' 
     FROM [dbo].[EventParticipants] AS [Extent2] 
     INNER JOIN [dbo].[Users] AS [Extent3] ON [Extent2].[ParticipantUsersID] = [Extent3].[ID]) AS [Join1] ON [Extent1].[ID] = [Join1].[EventsID] 
) AS [Project1] 
ORDER BY [Project1].[ID] ASC, [Project1].[C1] ASC 

, 엔티티가 반환 될 때 Event.EventParticipants EntityCollection가 비어 있습니다 볼 수 있습니다. 슬프게도. 실망스럽게. 고통스럽게. (나는 "ly"에서 벗어났다.)

나는 해결책을 찾기 위해 인터넷을 샅샅이 조사했지만 lazyloading 설정, 조인 조합 및 부적합한 내용의 조합으로 해결되지 않은 동일한 문제가있는 사람을 찾지 못했다. 탐색 속성.

방금 ​​전에 기본적인 것을 놓친 적이 있습니까? 제가 누락 된 주요 개념이 있습니까? 나는 그들이 같은 작업을 수행하고 그것이 작동하는 것처럼 보이는 오래된 고용주의 또 다른 프로젝트를 가지고 있습니다. 그래서 나는 그것을 할 수 있다고 확신합니다. 나만이지?

도움을 주시면 대단히 감사하겠습니다. 나는 나의 지혜 끝에있다. 미리 감사드립니다!

답변

3

composition/include 속성을 사용하여 모델에서 컬렉션의 특성을 확인해 보았습니까? 이뿐만 아니라 entitycollection를 직렬화하는 서비스를 RIA 알려줍니다, 링크를 heres 몇 문제였다 옳은 길

A guide through WCF RIA Services attributes

WCF RIA Services Part 5 - Metadata and Shared Classes

Composition Support in RIA Services

+1

에 당신을 받으실 수 있습니다! 여기에 Tim Heuer의 블로그가 있습니다 : [RIA Services and relational data] (http://timheuer.com/blog/archive/2010/01/05/master-details-with-ria-services-and-includedresults.aspx). 나는 실제로 그것을 고쳐서 당신이 그것을 못 박았다는 것을 알았을 때 게시물을 업데이트하기 위해 다시오고있었습니다. 필자는 이전에이 글을 읽었지만, .Include ("Path")와 include 속성이 똑같은 것으로 가정했다. 속성을 추가하면 문제가 해결되었습니다. 응답 해 주셔서 감사합니다. – Michael

+0

별 문제가 없습니다. :) –

관련 문제