[英]Silverlight / RIA Services / EF - Custom Objects
我一直在網上尋找一種解決我的問題的方法,但是我沒有任何運氣。 我正在開發Silverlight商務類應用程序,並嘗試使用RIA服務。 我可以成功加載和保存實體,而沒有任何重大問題,但是在我的應用程序首次加載時,我需要加載所謂的“值列表”。
我的值列表是獨立的實體,大約5個左右,由ID(鍵)和Value組成,它們用於填充組合框和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(Of ValueLists)。 無論我嘗試了什么,每當我嘗試使用自定義類型時,都無法將方法公開給客戶端。 甚至有可能通過RIA Services進行此類操作,或者它尚未成熟? 我知道我過去使用WCF進行了此操作,但是顯然需要做更多的工作。
預先感謝,凱西
(對不起,我的英語不好)
我之前曾嘗試過,但實際上不起作用。 如果為ValueList1
創建一個新類,它將起作用。 但是,如果您使用具有[Key]
屬性的類,由於某種原因,該類不會生成(該屬性不會出現在客戶端)。 因此,一種解決方案是創建類似ReadOnlyValueList1的類並返回它:
ret.ValueList1 = (from v1 In ObjectContext.ValueList1Items
select new ReadOnlyValueList1()
{
Prop1 = v1.Prop1,
Prop2 = v1.Prop2,
}).ToList();
(對不起,C#代碼,可能在VB中有些不同)
無論如何,這是有道理的,因為您不希望所有EF內容(跟蹤等)僅綁定某些列表和組合。
您應該能夠做到這一點而沒有問題,但是在將對象傳遞給RIA服務客戶端時, 需要指定一個[Key],該鍵必須保證在所有類似對象之間都是唯一的。 這是由於RIA服務在客戶端上處理那些對象的緩存方式。 另外,您的ValueList1Item,ValueList2Item等需要可序列化 。
通過這種方式進行設置時,RIA服務將使您的服務器POCO對象成為客戶端實體對象。 您將遇到的唯一問題是,您必須手動處理所有CUD操作。 如果您要傳遞給客戶端的是只讀數據,則無需擔心。
好吧,我設法更加接近了。 將Key添加到返回對象的Id屬性至少可以使其成功編譯,但是使用提琴手查看結果,我可以看到該對象中沒有任何內容。 我猜這是目前的某種序列化問題。
我從模型生成的另一個實體類的副本構造了返回對象(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
跟蹤此方法表明它實際上運行良好。 我可以看到所有值列表項均已正確填充,它永遠不會離開服務器。 這使我相信,這是某種程度上的序列化問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.