我正在使用使用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]
和[Association]
属性来传递数据。第一次使用ID =&gt;的关联执行此操作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; }
}
在服务器端,我正在加载菜单的两个级别,因此顶级项目包含一个SubItems集合,但下面没有其他SubItems。
我遇到的问题是,当RIA服务通过线路发送集合时,层次结构混乱。我已经确认我返回的内容结构正确但是没有正确到达客户端。最高级别没问题,但第二级(SubMenuItems)已经混淆,并且出现了两个更为明确的SubMenuItems级别。
知道我做错了什么吗?我假设问题出在协会或者同一个POCO对象(BusinessModelMenuDto)被用于多个级别的事实。
答案 0 :(得分:2)
我们发现我们必须为项目Key
使用Guids,并在返回客户端之前在服务器上为其分配唯一值。
所以你的班级定义会变成:
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();