2012-12-20 11 views
5

RIAサービスを使用してSilverlight 5 Business Applicationを使用して、サービス側からPOCOクラスを返して、階層メニューを作成しています。Silverlight POCO from RIA services

私が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プロパティを追加して、以下のように外部キーを設定するローディングコードを変更しました。また、アソシエートを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サービスがワイヤを介してコレクションを送信するときに、階層が混乱していることです。返されたものが正しく構造化されていることを確認しましたが、クライアント側に正しく到達していません。トップレベルはOKですが、2番目のレベル(SubMenuItems)が混在し、2つのより穏やかな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(); 
関連する問題