Ria Services将复杂对象作为参数传递给查询域服务方法

我遇到了与此线程中指定的问题类似的WCF RIA服务的一些困难。

我正在创建的域服务方法(Query方法)应该采用复杂的对象参数。 示例域服务方法:

public ComplexObjectResult GetComplexObject(ComplexObjectParameter test) { //do stuff } 

参数对象:

 public class ComplexObjectParameter { [Key] public decimal ID { get; set; } ... other fields } 

我得到此编译错误: 错误70域操作条目’GetComplexObject’的参数’test’必须是预定义的可序列化类型之一

在网上搜索了一下后,我发现了这个msdn线程 。 它声明这是RIA服务的限制,并且该线程没有指定任何体面的解决方法。

现在似乎有一些肮脏的解决方法:

  • 更改复杂参数以键入字符串和序列化/反序列化参数对象我自己,我发现一个非常hacky解决方案。

  • 在域服务方法上使用[Invoke]标签并放弃所有RIA跟踪function,我首先使用RIA。

是否有替代方案可以提供缺点较少的上述解决方案? 是否有人为此问题找到了更优雅的解决方法?

谢谢

脏的解决方法三,是使用[Invoke]属性并向域服务添加一个方法来公开“复杂类型”,它通知WCF RIA工具在客户端创建实体:

 public ComplexObjectParameter ExposeComplexObjectParameter() { throw new NotSupportedException(); } 

我在我的域服务方法中放置了NotSupportedException,以防止在远程调用该方法时出现静默失败。

我不确定这个解决方案如何影响失去“所有RIA跟踪function”的问题。 它没有回答如何使用复杂类型作为参数创建可组合查询。

它很脏,但抽象出最接近问题根源的问题。 呼叫和接收代码更清晰。 这样可以保持较高水平的“优雅”,同时推动脏污。

超级老问题,我知道。 但我对此感到满意,并找到了答案。 从ComplexObject上的MSDN Docs:

但是ComplexObject在重要方面与实体不同。 特别是,复杂类型没有身份。 这意味着它们没有标记KeyAttribute的成员,因此客户端不能像对实体那样对它们进行身份缓存。 无法从多个父实例共享或引用复杂类型,并且它们不支持inheritance。