2012-02-13 115 views
0

我一直在網上搜索一種方法來解決我的問題,我沒有任何運氣。我正在開發一個Silverlight商務類應用程序,並嘗試使用RIA服務。我成功地加載和保存沒有任何重大問題的實體,但是當我的應用程序第一次加載時,我需要加載我所謂的「值列表」。Silverlight/RIA服務/ EF - 自定義對象

我的值列表是獨立的實體,大概5個左右,由Id(鍵)和Value組成,它們用於填充combobox和autocompletebox之類的東西。我可以單獨查詢每一個,但是我寧願在一次查詢中一次加載所有值列表,以加快速度,因爲每條記錄少於15條記錄。我試圖開發一個自定義類返回所有這些,它看起來像這樣...

<DataContract(IsReference:=True)> 
<KnownType(GetType(ValueList1Item))> 
<KnownType(GetType(ValueList2Item))> 
<KnownType(GetType(ValueList3Item))> 
Partial Public Class ValueLists 

    <DataMember()> 
    Public Property ValueList1 AS List(Of ValueList1Item) 

    <DataMember()> 
    Public Property ValueList2 AS List(Of ValueList2Item) 

    <DataMember()> 
    Public Property ValueList3 AS List(Of ValueList3Item) 
End Class 

我已經試過許多方法來實現服務的方法,其中一個看起來是這樣的...

Public Function GetValueLists() As ValueLists 
     Dim ret As ValueLists = New ValueLists 

     ret.ValueList1 = (From v1 In ObjectContext.ValueList1Items 
          Select v1).ToList 

     ret.ValueList2 = (From v2 In ObjectContext.ValueList1Items 
          Select v2).ToList 

     ret.ValueList3 = (From v3 In ObjectContext.ValueList3Items 
          Select v3).ToList 

     Return ret 
    End Function 

我也試過返回一個IQueryable(ValueLists)。無論我嘗試過什麼,每當我嘗試使用自定義類型時,都無法將該方法公開給客戶端。 RIA Services甚至有可能做這樣的事情還是尚未成熟?我知道我在過去用直WCF完成了這一點,但它顯然有更多的工作。

由於提前, 凱西

回答

0

(對不起我的英文不好)

我以前嘗試這樣做,它確實沒有工作。如果你爲ValueList1創建了一個新類,它就可以工作。但是,如果您使用具有[Key]屬性的類,出於某種原因,它不會生成(該屬性不會出現在客戶端)。所以,一個解決辦法是像ReadOnlyValueList1創建類並返回它:

ret.ValueList1 = (from v1 In ObjectContext.ValueList1Items 
         select new ReadOnlyValueList1() 
         { 
          Prop1 = v1.Prop1, 
          Prop2 = v1.Prop2, 
         }).ToList(); 

(對不起,C#代碼,可能這是在VB中有少許差別)

它任何意義,因爲你不希望所有EF的東西(跟蹤等)只是爲了綁定一些列表和組合。

+0

謝謝你的回覆獅子座。只要我有機會,我會嘗試一下,看看它是否有效。如果我繼續遇到像這樣的問題,我可能會很快傾倒RIA服務,並直接進入常規的WCF實現。我知道WCF是更多的工作,但它肯定是更靈活,這是很好的。在這一點上,我認爲RIA Services不是複雜程度相當高的應用程序的最佳解決方案,但也許我錯了。 – Casey 2012-02-13 16:05:05

+0

那麼我對這個獅子座還沒有任何運氣。我真的不希望實體只能被讀取,因爲我將有一個「系統」頁面,用戶可以編輯這些值列表。 – Casey 2012-02-16 12:12:42

0

你應該能夠做到這一點沒有問題,而是傳遞一個對象到RIA服務客戶端時,你需要指定一個[關鍵]這是保證所有喜歡的對象之間唯一的。這是由於RIA服務處理緩存客戶端上的這些對象的方式。此外,您的ValueList1Item,ValueList2Item等需要可序列化

當這樣設置時,RIA服務會將你的服務器POCO對象變成客戶端實體對象。您將遇到的唯一問題是您必須手動處理任何CUD操作。如果它是您傳遞給客戶端的只讀數據,則無需擔心。

+0

正如Derreck所建議的,我將Key屬性添加到DTO的Id屬性中,該屬性只是一個隨機生成的數字。雖然這次編譯正確,但它仍然不按照fiddler傳輸數據。我認爲在這一點上,我將傾銷RIA服務並實現標準的WCF實施。是的,開發需要更長的時間,但靈活性要好很多,我已經瞭解了WCF,所以最終它可能會更流暢,甚至更快。到目前爲止,我不是IQueryable的粉絲,我知道WCF我可以使用沒有問題的列表。 – Casey 2012-02-16 14:20:23

+0

如果您使用該方法,我不會打擾使用IQueryables。只需使用數組或列表。讓它工作並不容易,所以我可以理解你的挫敗感。我一直在使用RIA服務已經有一年多的時間了,我認爲有很多事情需要解決。如果你碰巧使用數組或列表而不是IQueryable來給它另一個鏡頭,讓我知道它是如何工作的。 – 2012-02-17 15:13:30

0

嗯,我設法得到了一點點。將Key添加到返回對象的Id屬性中,至少使它成功編譯,但使用fiddler查看結果我可以看到對象中沒有任何內容。我猜這是這種序列化問題。

我從我的模型生成的另一個實體類的副本構造了我的返回對象(dto),以確保我沒有錯過任何東西。然後我評論了所有更改跟蹤,以確保它不會造成任何問題。下面是類:

<DataContract(IsReference:=True)> _ 
<KnownType(GetType(ValueList1Item))> _ 
<KnownType(GetType(ValueList2Item))> _ 
Partial Public Class ValueLists 

#Region "Primitive Properties" 

    <DataMember()> _ 
    <Key()> _ 
    Public Property Id() As Long 
     Get 
      Return _id 
     End Get 
     Set(ByVal value As Long) 
      If Not Equals(_id, value) Then 
       _id = value 
      End If 
     End Set 
    End Property 

    Private _id As Long 



    <DataMember()> _ 
    Public Property ValueList1() As List(Of ValueList1Item) 
     Get 
      Return _valueList1 
     End Get 
     Set(ByVal value As List(Of ValueList1Item)) 
      If Not Equals(_valueList1, value) Then     
       _valueList1 = value    
      End If 
     End Set 
    End Property 

    Private _valueList1 As List(Of ValueList1Item) 



    <DataMember()> _ 
    Public Property ValueList2() As List(Of ValueList2Item) 
     Get 
      Return _valueList2 
     End Get 
     Set(ByVal value As List(Of ValueList2Item)) 
      If Not Equals(_valueList2, value) Then     
       _valueList2 = value    
      End If 
     End Set 
    End Property 

    Private _valueList2 As List(Of ValueList2Item) 

#End Region 
End Class 

而且我使用的構造和返回對象看起來像這樣的方法......

Public Function GetValueLists() As ValueLists 
     Dim ret As ValueLists = New ValueLists 

     ret.Id = RandomNumber(1, 100000000) 

     ret.ValueList1 = (From vli1 In ObjectContext.ValueList1Items 
           Select vli1).ToList() 

     ret.ValueList2 = (From vli2 In ObjectContext.ValueList2Items 
             Select vli2).ToList() 


     Return ret 
    End Function 

跟蹤這種方法表明它實際上是工作的罰款。我可以看到正確填充的所有值列表項,它只是永遠不會離開服務器。這導致我相信這是某種序列化問題。