RIA服务返回的Silverlight POCO

5

我是一个使用RIA服务返回一个POCO类来填充分层菜单的Silverlight 5商业应用程序。

我在POCO类方面遇到的最初问题是,尽管在服务端已经填充了它,但SubMenuItems属性没有通过RIA服务传递。

原始POCO

public class BusinessModelMenuDto
{
    [Key]
    [Required]
    public int ID { get; set; }
    public string TextToDisplay { get; set; }
    public string ImageSource { get; set; }
    public IEnumerable<BusinessModelMenuDto> SubMenuItems { get; set; }
}

服务调用

 public IEnumerable<BusinessModelMenuDto> GetCabsHeirarchy()

在进一步调查后,我发现需要在 SubMenuItems 上使用 [Include][Association] 属性才能传递数据。第一次尝试使用 ID => ID 关联并没有得到期望的结果,因此我添加了 ParentID 属性,并更改了我的加载代码来填充外键,如下所示。我还将关联从 ID 映射到 Parent ID。

更新后的 POCO 类

public class BusinessModelMenuDto
{
    [Key]
    [Required]
    public int ID { get; set; }
    public int? ParentID { get; set; }
    public string TextToDisplay { get; set; }
    public string ImageSource { get; set; }
    [Include]
    [Association("SubItems", "ID", "ParentID")]
    public IEnumerable<BusinessModelMenuDto> SubMenuItems { get; set; }
}

在服务器端,我目前加载了两个菜单级别,因此顶层项目包含SubItems集合,但下面没有更多的SubItems。
我的问题是,当RIA服务通过网络发送集合时,层次结构被混淆了。我已经确认我收到的结构正确,但在客户端上却没有正确到达。顶层是正常的,但第二级(SubMenuItems)被混淆,出现了两个进一步的SubMenuItems级别。
你有什么想法吗?我认为问题出在关联或同一个POCO对象(BusinessModelMenuDto)用于多个级别的事实上。

我快速浏览了一下我们的代码。虽然我不是专家,但在我们有类似结构的地方,我们使用的是List<>而不是IEnumerable<>。 - GarethOwen
1
底层对象是一个List<T>,但我尝试将属性更改为IList<T>,但仍然无法工作。 - Phil Murray
你能发布一下DomainService的查询方法吗? - Jehof
每个ID都需要是唯一的,否则在客户端上你的分层结构会被破坏。 - Jehof
如果您发布一个简单的层次结构,包括所有属性(至少包括“ID”和“ParentID”),以及客户端看到的混乱结果,那将非常有用。 - Sphinxxx
1个回答

2
我们发现在传回客户端之前,需要在服务器上为项目 Key 使用Guid并分配唯一值。
因此,您的类定义将变为:
public class BusinessModelMenuDto
{
    [Key]
    [Required]
    public Guid ID { get; set; }
    public Guid? ParentID { get; set; }
    public string TextToDisplay { get; set; }
    public string ImageSource { get; set; }
    [Include]
    [Association("SubItems", "ID", "ParentID")]
    public IEnumerable<BusinessModelMenuDto> SubMenuItems { get; set; }
}

当你创建一个新元素时,请设置ID:

ID = Guid.NewGuid();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接