5

我正在使用使用 RIA 服务的 Silverlight 5 业务应用程序从服务端返回 POCO 类以填充分层菜单。

我对 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]and[Association]属性才能传递数据。第一次使用 ID => ID 的关联没有给出预期的结果,因此我添加了 ParentID 属性并更改了加载代码以填充外键,如下所示。我还将 Associate 更改为从 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; }
}

在服务器端,我目前正在加载两级菜单,因此顶级项目包含一组子项,但在此之下没有其他子项。

我遇到的问题是,当 RIA 服务通过网络发送集合时,层次结构变得混乱。我已确认我返回的内容结构正确,但未正确到达客户端。顶层还可以,但第二层(SubMenuItems)混在一起,出现了两个更进一步的 SubMenuItems 层。

知道我做错了什么吗?我认为问题出在关联上,或者是同一个 POCO 对象(BusinessModelMenuDto)被用于多个级别。

4

1 回答 1

2

我们发现我们必须对项目使用 GuidKey并在服务器上为其分配一个唯一值,然后再传回客户端。

所以你的类定义会变成:

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();
于 2013-01-02T12:00:11.280 回答