Silverlight / RIA服务/ EF - 自定义对象

时间:2012-02-13 14:31:04

标签: .net wcf silverlight wcf-ria-services ria

我一直在网上寻找解决我的问题的方法,但我没有运气。我正在开发一个Silverlight商务类应用程序并尝试使用RIA服务。我成功加载和保存实体没有任何重大问题,但是当我的应用程序首次加载时,我需要加载我称之为“值列表”的内容。

我的值列表是独立的实体,可能是5个左右,由Id(键)和Value组成,它们用于填充组合框和自动填充框等内容。我可以单独查询每个值,但是我宁愿在一个查询中一次加载所有值列表以加快速度,因为每个值少于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服务做这样的事情还是尚未成熟?我知道我过去用直接的WCF做过这个,但显然更多的工作。

提前致谢, 凯西

3 个答案:

答案 0 :(得分:0)

(抱歉我的英语不好)

我以前试过这个,但它确实不起作用。如果您为ValueList1创建新类,则可以正常工作。但是,如果您使用具有[Key]属性的类,由于某种原因,它不会生成(该属性不会出现在客户端)。因此,一种解决方案是创建类似ReadOnlyValueList1的类并返回它:

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

(对不起,C#代码,可能这在VB中有点不同)

无论如何它是有道理的,因为你不希望所有的EF东西(跟踪等)只是绑定一些列表和组合。

答案 1 :(得分:0)

您应该可以毫无问题地执行此操作,但在将对象传递给RIA服务客户端时,需要指定[Key],保证在所有类似对象之间保持唯一。这是由于RIA服务处理客户端缓存这些对象的方式。此外,您的ValueList1Item,ValueList2Item等需要可序列化

当以这种方式设置时,RIA服务将使您的服务器POCO对象成为客户端实体对象。您将遇到的唯一问题是您必须手动处理任何CUD操作。如果它是您传入客户端的只读数据,则无需担心。

答案 2 :(得分:0)

好吧,我已经设法更近了一点。将键添加到返回对象的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

跟踪此方法表明它实际上工作正常。我可以看到所有值列表项都已正确填充,它只是永远不会离开服务器。这让我相信这是某种序列化问题。