2012-07-05 116 views
2

经过广泛的Googleing之后,我仍然对着墙壁猛撞我的头。使用Silverlight 4 WCF RIA域名服务的复杂类型

我想获得一个域服务来返回客户端的对象列表。我的对象是

[DataContract] 
public class MyComplexType { 
    [Key] 
    [DataMember] 
    public int Id { get; set; } 
    [DataMember] 
    public string SomeString { get; set; } 
    [DataMember] 
    public IEnumerable<MySubType> SubTypes { get; set; } 
} 

[DataContract] 
public class MySubType { 
    [Key] 
    [DataMember] 
    public int Id { get; set; } 
    [DataMember] 
    public string AnotherString { get; set; } 
} 

域名服务具有以下

[Query] 
[Invoke] 
public IQueryable<MyComplexType> GetMyComplexTypes() { 
    /* return stuff */ 
} 

但在客户端的MyComplexType对象不具有亚型财产,我尝试添加属性:

[DataMember] 
public int ComplexTypeId { get; set; } 

...到M​​ySubType,属性:

[Association("SubType_FK", "Id", "ComplexTypeId")] 

...到M​​yComplexType中的SubTypes属性。

但它仍不会将SubTypes属性推送到客户端。 我有另一个对象(原理相同,但有真实代码),其中SubTypes等价物在客户端POCO上,但它总是空的(无论从服务器返回什么)。

我觉得我必须在这里错过一些东西,这肯定不应该那么困难?任何帮助或解释或指导一个有用的资源,将不胜感激。

UPDATE: 我发现如果我添加下面的查询添加到域服务:

public IQueryable<MySubType> GetMySubTypes() { 
     throw new NotImplementedException(); 
    } 

我现在可以从客户端访问MyComplexType.SubType属性,但是当我测试它用下面的代码...

_Context.Load(_Context.GetMyComplexTypesQuery(), 
      r => { 
       myComplexTypes = r.Entities; 
       var noCts = myComplexTypes.Count(); 
       foreach (var ct in myComplexTypes) { 
        var noSts = ct.SubTypes.Count(); 
       } 
      }, null); 

我调试它,有两个复合类型,我创建(所以noCts是2),但每次迭代noSts为0,尽管我的服务器 - 添加亚型SID即

任何想法?

+0

您是否尝试过比您的子类型的IEnumerable 更具体的东西?例如尝试一个'列表'并查看它是否生成客户端代理。客户端代理不会生成为服务器POCO中指定的确切类型。 – 2012-07-05 15:30:29

+0

与列表相同:-( – Ben 2012-07-05 15:39:39

+1

首先:丢失'DataMember'属性,因为Ria Services不需要它们。第二:您发送的项目有多大? - >检查web.config以获取最大值第三:你是否返回'IQueryable '并在触发查询之前使用'.ToList()'或类似的方法处理DataContext? – Silvermind 2012-07-05 22:52:35

回答

0

您可能只需要添加[ComplexType]属性:

using System.ComponentModel.DataAnnotations; 

[ComplexType] 
public class MyComplexType { 
    public int Id { get; set; } 
    public string SomeString { get; set; } 
    public IEnumerable<MySubType> SubTypes { get; set; } 
} 

[ComplexType] 
public class MySubType { 
    public int Id { get; set; } 
    public string AnotherString { get; set; } 
} 

[DataContract][DataMember]属性都是可选的。它们由WCF RIA自动推断。

+0

感谢您的回应,似乎无法找到ComplexType的名称空间,我需要那个吗? – Ben 2012-07-06 16:15:14

+0

我为命名空间添加了使用。此外,你不应该需要'[Key]'属性,所以我将它们从我的答案中删除。 – 2012-07-06 17:46:12

+0

嗯我有'使用'剧照说它不存在,你使用的是哪个版本。 – Ben 2012-07-18 11:31:22