2012-12-20 35 views
5

Używam aplikacji biznesowej Silverlight 5 przy użyciu usług RIA, aby zwrócić klasę POCO ze strony usługi, aby zapełnić hierarchiczne menu.Silverlight POCO zwrócony przez usługi RIA

Pierwotny problem z klasą POCO polegał na tym, że właściwość SubMenuItems nie była przekazywana przez usługi RIA, mimo że została zapełniona po stronie usługi.

Original 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; } 
} 

Wezwanie serwisu

public IEnumerable<BusinessModelMenuDto> GetCabsHeirarchy() 

Po pewnym dalszych badań okazało się, że [Include] i [Association] atrybuty były wymagane na SubMenuItems przekazać dane skończona. Wykonanie tego po raz pierwszy z identyfikatorem Association ID => nie dało pożądanych rezultatów, więc dodałem właściwość ParentID i zmieniłem kod ładujący, aby wypełnić klucz obcy, jak poniżej. Zmieniłem również Associate, aby mapować z ID na Parent ID.

Updated klasa 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; } 
} 

Po stronie serwera wczytuję dwa poziomy menu w tej chwili więc element najwyższego poziomu zawiera zbiór elementów składowych, ale nie ma dalszych podpunktach poniżej tego.

Problem polega na tym, że gdy usługi RIA wysyłają kolekcję przez sieć, hierarchia jest pomieszana. Potwierdziłem, że to, co otrzymałem, jest poprawnie skonstruowane, ale nie pojawia się poprawnie po stronie klienta. Najwyższy poziom jest OK, ale drugi poziom (SubMenuItems) jest pomieszany i pojawiły się dwa kolejne poziomy SubMenuItems.

Każdy pomysł, co robię źle? Zakładam, że problem dotyczy stowarzyszenia lub faktu, że ten sam obiekt POCO (BusinessModelMenuDto) jest używany dla wielu poziomów.

+0

miałem okiem przez naszego kodu. Nie jestem ekspertem, ale gdziekolwiek mamy podobną strukturę, używamy Listy <>, a nie IEnumerable <> – GarethOwen

+1

Obiektem bazowym była Lista , ale próbowałem zmienić właściwość na IList , ale nadal nie działa . –

+0

można opublikować metodę kwerendy usługi DomainService? – Jehof

Odpowiedz

2

Znaleźliśmy, że musieliśmy użyć Guids dla pozycji Key i przypisać do niego unikalną wartość na serwerze przed przekazaniem do klienta.

Więc definicja klasy staną:

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; } 
} 

Następnie podczas tworzenia nowego elementu ustawić ID:

ID = Guid.NewGuid();