2009-10-13 4 views
2

이 문제는 몇 년 동안 네트워크에서 발생하며 아직 좋은 해결책을 찾지 못했습니다. 주제는 그들이 NHibernate에 의해 채워 내부 순환 참조가 개체의 목록 통과 (또는 게으른 무부하을 - 일부 사이트가 게으른 수행 할 수 없습니다 SAIS) 여기 순환 참조, NHibernate 및 WCF

은 예입니다

[DataContract] 
class Person 
{ 
    [DataMemeber] 
    string Name 
    [DateMember] 
    IList<Child> myChilds; 
} 

[DataContract] 
class Child 
{ 
    [DataMemeber] 
    string Name 
    [DateMember] 
    Person Father 
} 

내가 얻을 때 모든 사람은 내 DB에 : 서버 코드는 다음과 같습니다

ICriteria crit = session.CreateCriteria(typeof(Person))); 
IList<Base> queryResult = crit.List<Base>(); 

내가 모든 사람 내부의 서버에 좋은 결과가 모든 사람의 목록을 사이 드 얻고, 나는 모든 아들들의 목록을 얻는다. (그리고 각 아들 안에 - 나는 그의 아들리스트가있는 Person 객체를 얻는다.)

이제 WCF를 통해이리스트를 얻으려고하면 채널이 잘못되었다. (자식에서 Person 개체를 제거하면 올바르게 작동 함).

솔루션이 문제를 해결하기 위해 노력했지만 해결하지 못했습니다. [DataContract]에 IsReference = true를 추가하면 도움이되지 않았습니다. 모든 매핑을 not.Lazyload()로 이동하면 도움이되지 않았습니다.

모든 아이디어 WCF를 다시 작성하지 않고이를 해결하는 방법은 무엇입니까? 문제는 응답의 크기 같은

감사합니다, 다니

답변

2

http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7

이 문서가 문제를 해결 ... 당신의 정확한 요구 사항에 따라 달라집니다.

편집 :

링크가 분명히 죽은 것으로 보입니다. Wayback Machine을 사용하여 여기에 보관 된 버전을 확인하십시오. http://web.archive.org/web/20070219214621/http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7

+0

링크가 현재 고장났습니다. – Restuta

+0

링크가 사라졌습니다 - 404. – ssmith

0

는 것 같습니다. WCF는 전송할 메시지의 크기를 구성합니다. 하위 오브젝트를 포함 시키면 제한을 초과하게됩니다.

+0

기본 크기는 WCF입니다. 나는 "Person"개체가 5 개 밖에없고, 그 중 오직 하나만 아들을 가지고 있습니다. 이것은 크기 문제 일 수 있습니다 - 직렬화의 무한 루프로 인해 원래 구조는 몇 가지 K 이상입니다 .... – Dani

0

실제로 객체 그래프의 모양을 유지하려면 IsReference이 실제로 여기 공식 답변입니다. http://msdn.microsoft.com/en-us/library/cc656708.aspx을 참조하십시오. "도움이 안된다"고 말할 때 무슨 뜻인지 자세히 설명해 주시겠습니까? 정확히 IsReference를 넣었습니까? 클라이언트와 서버 측 모두에서? 어떤 오류를 관찰 했습니까?

ref 보존에 신경 쓰지 않는다면 무한한 참조주기를 깨는 여러 가지 해결책이 있습니다. 가장 간단한 방법은 "Father"에서 DataMember 특성을 제거하는 것입니다. 아니면 "그림자 속성"뭔가가 :

public Person Father; 
[DataMember] public string FatherName 
{ get {return Father.Name;} set {/* ... */ }} 

정말 강력

+0

DataContract 특성에 IsReference를 넣었습니다. 링크 된 기사에서 문제가되는 [DataMember]에 있어야하지만 놀랍게도 [DataMember]는이 플래그에 대해 알지 못합니다. 이 코드는 컴파일되지 않습니다 !! (예제의 소스 인 MSDN은 매우 이상합니다 ...) Systme.RunTime.Serialization DataMemberAttribute에 IsReference = true ..... A Puzzle의 정의가 없습니다. – Dani

+0

음, 그래, 주제가 깨진 것을 알지 못했습니다 ... 여전히 : - IsReference를 Child 및 Person 유형에 모두 입력 했습니까? - IsReference를 시도했을 때 정확히 무슨 일이 일어 났습니까? (예외 등?) –

+0

동일한 예외 - 아무것도 변경되지 않았습니다. 예외는 일반적이며 특정 사항은 없습니다. 다른 시리얼 라이저로 옮길 것을 제안하는 기사를 읽었습니다. 이 옵션을 확인하면 여기에서 다시보고하겠습니다. 필자는 Microsoft에이 기사에 대해 물어 봤지만 여전히 대답을 기다리고 있습니다. – Dani