2012-12-20 50 views
5

我正在使用使用RIA服務的Silverlight 5業務應用程序從服務端返回POCO類以填充分層菜單。RIA服務返回的Silverlight 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() 

經過一些進一步的調查我發現,[Include][Association]屬性都需要在SubMenuItems超過傳遞數據。第一次使用ID => ID關聯時沒有給出期望的結果,因此我添加了ParentID屬性並更改了我的加載代碼,以填充外鍵,如下所示。我還將Associate從ID映射到了家長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)被用於多個級別。

+0

我不得不通過我們的代碼快速瀏覽一下。我不是專家,但我們有一個類似的結構,我們使用的是List <>而不是IEnumerable <> – GarethOwen

+1

底層對象是List ,但我嘗試將屬性更改爲IList ,但它仍然不工作。 –

+0

你可以發佈你的DomainService的查詢方法嗎? – Jehof

回答

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();