2009-04-16 6 views
2

WCF를 통해 linq 객체를 직렬 처리합니다. dbml은 단방향 직렬화를 위해 설정됩니다.WCF를 사용하여 linq 엔티티 직렬화

내 개체는 매우 간단합니다. Budget에는 BudgetLineItems 컬렉션이 있습니다. 각 BudgetLineItem에는 ItemCateogry가 있습니다.

예산/BudgetLineItem은 잘 serialize됩니다. 그러나 각 BudgetLineItem의 ItemCatogry는 그렇지 않습니다. 기본적으로 linq는 각 BudgetLineItem에 대한 ItemCategory에 [DataMember]를 추가하지 않았습니다. 수동으로 추가하고 [IgnoreDataMember]를 사용하여 ItemCategory 엔터티에 가능한 순환 참조를 제거했습니다. 그러나 운이 없다.

질문 :

  1. 는 WCF 수, 기본적으로 대일 관계를 직렬화, 아니면 내가 뭔가를 놓친 거지? 직렬화 된 데이터가 각 BudgetLineItem에 대해 중복 된 ItemCategory 데이터로 인해 다소 오히려 줄어들지 만 괜찮습니다.

  2. 이 경우 사용자 지정 DataContractSerializer를 수행해야합니까?

** 실제로 ** 실제로는 (DataMember 추가) 작동했지만 클라이언트 (duh)에서 서비스 참조를 업데이트하지 않았습니다.

새로운 질문 : 디자이너가 생성하는 엔티티에서 [DataMember] 및 [IgnoreDataMember] 필드를 유지하도록 linqtosql 디자이너에 지시 할 수있는 방법이 있습니까? 그렇지 않으면 dbml을 저장할 때마다 업데이트해야합니다.

답변

3

와우 당신은 WCF 용 LINQ 2 SQL 개체를 성공적으로 직렬화 했습니까?

내가 이것을 시도했을 때 (정말 마지 못해서, 아래의 이유를 참조하십시오.) 정말 넘어졌습니다. L2S 엔티티에 자식을 가리키는 관계가 있었고, 그 다음 부모를 가리키는 자식이 있었고 분명히 건물을 열거 할 때 열거했습니다. WCF 객체를 사용하면이 방법으로 트리를 무한히 통과 할 수 없으며 오버 플로우 예외가 발생한다는 것을 기억합니다. 따라서이 길을 가면 기본적으로 말합니다.

Michael의 게시물에 이어 WOC 개체를 POCO (사용자 지정 모델 표현)로 변환하는 것이 좋습니다. WCF 요청에 필요한 것만 큼 명확한 데이터의 하위 집합을 전송하는 사용자 지정 WCF 개체를 만드는 것을 선호하기 때문에 위의 작업이 제대로 수행되지 않아서 기쁩니다. 그런 다음 불필요한 데이터 스택을 포함하지 않습니다. 데이터를 통해 전송되며 L2S 엔티티에 많은 정보가 포함되어 있다고 확신합니다. 내가 L2S 데이터를 직접 전송하려고 한 실제 이유는 특정 규칙을 사용하는 엔진을 만들어야했기 때문입니다.이 규칙은 관계가있는 약 4 개의 데이터베이스 테이블의 상관 관계에 저장되어 있었으며 별도의 데이터를 유지할 수 없었습니다 WCF 개체.

그래서 결국 나는 Custom code gen 클래스를 확장하여 [DataContext]와 함께 Wcf.cs를 포함하고 L2S 클래스 -> WCF 사용자 정의 클래스의 속성을 복제했습니다.

이것은 결국 완벽하게 작동했으며 이것은 cloning procedure I used with instructions on my blog입니다.

나는 이것에 만족하며 나쁜 습관이 있다고 생각하지 않는다. 희망이 도움이됩니다.

+0

정보 주셔서 감사합니다. 성공적인 직렬화를 위해 우리는 [DataMemberIgnore]를 재귀 적 (일반적으로 부모에 대한 참조) 인 모든 소품에 추가해야했습니다. 이는 소급되지 않기 때문입니다. dbml을 변경하면 모든 변경 사항을 덮어 씁니다. 그것은 작동하지만 아주 매끄럽지는 않습니다. 알다시피, 직렬화 된 객체는 _huge_입니다. 다행히도 이것은 개념 증명을위한 것입니다 (SQLRS2008은 WCF 레이어를 사용하여 우리의 서비스를 줄였습니다.) – ericvg

+0

OK no prob. 내 복제 절차를 잘 살펴보고, 그 경로가 도움이되기를 바랍니다. – GONeale

+0

좋아요! 귀하의 블로그가 사라진 것을 제외하고는 : ( – Moulde

1

WCF와 함께 linq 엔티티를 보내면 안됩니다. 대신 자신 만의 비즈니스 데이터 모델을 만들어이를 유선으로 전송하십시오. 데이터베이스를 변경 한 경우 서비스와 연결된 모든 프로그램을 변경하고 싶지는 않습니다.

+0

그러나이 특정 항목의 목적을 위해 우리는 그 것을 거래하고 있습니다. – ericvg