首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回基本对象列表的服务方法给出了“复杂类型不能指定KnownTypeAttribute”消息

返回基本对象列表的服务方法给出了“复杂类型不能指定KnownTypeAttribute”消息
EN

Stack Overflow用户
提问于 2011-12-23 16:22:43
回答 2查看 633关注 0票数 0

我使用WCF RIA服务将自定义数据传输对象返回给Silverlight客户端。

我想返回一个对象,比如FruitBasket (类似于这个职位),它包含一个水果列表。果树类是派生类的基类,例如Apple、Pear、Peach等。在运行时,水果列表可以包含任何派生类型。我希望RIA序列化和反序列化整个FruitBasket对象,包括它的成果集合。

  • 如果我只是定义我的类层次结构并返回整个FruitBasket对象,我就会得到一个运行时错误:

键入'Peach‘与数据契约名称'Peach:http://schemas.datacontract.org/2004/07/FruitApp’是不需要的。考虑使用DataContractResolver或将任何类型静态地添加到已知类型列表中,例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

  • 如果我然后在我的水果类上指定了[KnownType(typeof(Peach))]属性,我就会得到一个编译时错误:

复杂类型的“水果”无效。复杂类型不能指定KnownTypeAttribute。

如何建立数据模型,以便访问客户端上的果树集合?在客户端,如果只将对象识别为“水果”对象,则甚至可以。我只需要他们去反序列化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-23 20:13:23

RIA服务支持两种用户类型:复杂类型和实体类型。实体是一个持久化对象,具有唯一标识它的键。复杂类型就是将几个基本类型字段组合成一个对象。它们不使用类和层次结构的一般概念,它们限制您可以或不能做什么,以便更有效地解决一些特定问题。

其中一个限制是复杂类型不能具有派生类型。很难说为什么,但我认为如果没有限制,框架就会复杂得多。

现在,有几种方法可以解决这个问题:

  1. 如果您的Fruit类中已经有了适当的键(例如,数据库Id),只需使用[Key]属性标记它。
  2. 如果您没有密钥,也不关心,那么添加一个返回GuidGuid.NewGuid()属性,用[Key]标记它,就可以了。注意到,在这种情况下,您将无法设置与Fruit实体的任何关系,也无法将更改保存回服务器。
  3. 不要使用继承。如果不是真的有必要的话,为什么不带着它活着呢?
  4. 使用普通WCF。RIA服务不是一个通用的通信框架。它们对于所有这些实体都是非常具体的--关系之类的东西。

选择取决于您,因为这取决于您的需求。

票数 2
EN

Stack Overflow用户

发布于 2011-12-23 18:34:02

显然,WCF将把任何没有KeyAttribute的类视为一个复杂类型,从而引发错误。

因此,如果您的果树基类中有一个可以用作键的属性,那么用[Key]来修饰它应该可以解决复杂类型的错误消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8618287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档