2011-12-23 1 views
0

WCF RIA Services를 사용하여 사용자 지정 데이터 전송 개체를 Silverlight 클라이언트로 반환하고 있습니다.기본 개체 목록을 반환하는 서비스 메서드에서 'Complex types can KnownTypeAttribute'메시지를 지정할 수 없습니다.

과일 목록이 들어있는 FruitBasket (this post과 유사) 개체를 반환하고 싶습니다. Fruit 클래스는 Apple, Pear, Peach 등과 같은 파생 클래스의 기본 클래스입니다. 런타임시 Fruits 목록에는 이러한 파생 된 유형 중 하나가 포함될 수 있습니다. RIA Services가 FruitBasket 객체를 직렬화 및 비 직렬화하기를 원합니다.

Type 'Peach' with data contract name 'Peach:http://schemas.datacontract.org/2004/07/FruitApp' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

  • 그때 나는 내 과일 클래스에 [KnownType(typeof(Peach))] 속성을 지정하는 경우 : 난 그냥 전체 FruitBasket 개체를 내 클래스 계층 구조를 정의하고 반환하는 경우

    • , 나는 런타임 오류

    Complex type 'Fruit' is invalid. Complex types cannot specify a KnownTypeAttribute.

    : 컴파일 시간 오류 클라이언트의 Fruit 컬렉션에 액세스 할 수 있도록 데이터 모델을 설정하려면 어떻게해야합니까? 클라이언트 측에서는 객체가 "과일"객체로만 인식되는 경우에도 괜찮습니다. 나는 그들을 비유화할 필요가있다.

답변

2

RIA 서비스는 복합 유형 및 엔티티 유형의 두 가지 유형의 사용자 유형을 지원합니다. 엔티티는 고유하게 식별하는 키가있는 영구 객체입니다. 복합 형은 단순히 여러 프리미티브 유형 필드를 단일 객체로 그룹화 한 것입니다. 그들은 클래스와 계층 구조의 일반적인 개념과 함께 작동하지 않으며, 특정 문제를보다 효율적으로 해결하기 위해 할 수있는 것과 수행 할 수없는 것에 대한 제한을 두었습니다.

제한 사항 중 하나는 복합 유형에 파생 유형이 없어야한다는 것입니다. 왜 그런지 말하기는 어렵지만 제한이 없다면 프레임 워크가 훨씬 더 복잡 할 것이라고 생각합니다. 단지 [Key] 속성을 표시, 당신은 이미 (가령 데이터베이스 ID)를 당신의 Fruit 클래스에 적절한 키가있는 경우

  1. :

    지금이 문제를 해결하기 위해 몇 가지 옵션이 있습니다.

  2. 키가없고 상관하지 않는 경우 Guid 속성을 추가하여 Guid.NewGuid()을 반환하고 [Key]으로 표시하면 문제가 없습니다. 참고이 경우 Fruit 엔티티에 대한 관계를 설정하고 서버에 변경 사항을 다시 저장할 수 없습니다.
  3. 상속을 사용하지 마십시오. 그것이 정말로 필요하지 않다면, 그것없이 살지 않는 이유는 무엇입니까?
  4. 일반 WCF를 사용하십시오. RIA 서비스는 일반적인 경우의 통신 프레임 워크가 아닙니다. 그것들은이 모든 엔티티 관계들에 대해 매우 구체적입니다.

귀하의 요구 사항에 따라 선택의 여지가 있습니다.

+0

팁 # 2 및 # 4는 매우 유용했습니다. 결국 WCF Services (# 4)로 전환하기 전에 응용 프로그램의 다른 영역에서 # 2를 사용하기 시작했습니다. – YeahStu

0

분명히 WCF RIA Services는 KeyAttribute이없는 클래스를 복합 유형으로 간주하므로 오류가 발생합니다.

과일베이스 클래스에 키로 사용할 수있는 속성이있는 경우 [Key]으로 꾸미면 복합 유형 오류 메시지가 해결됩니다.