Silverlight / RIA Services / EF - Пользовательские объекты - PullRequest
0 голосов
/ 13 февраля 2012

Я искал во всей сети способ решения своей проблемы, и мне не повезло. Я занимаюсь разработкой приложения бизнес-класса Silverlight и пытаюсь воспользоваться услугами RIA. Я успешно загружаю и сохраняю сущности без каких-либо серьезных проблем, однако мне нужно загрузить то, что я называю «списками значений», когда мое приложение загружается впервые.

Мои списки значений - это независимые объекты, вероятно, 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 (Of ValueLists). Независимо от того, что я пробовал, всякий раз, когда я пытаюсь использовать свой пользовательский тип, он не предоставляет метод клиенту. Можно ли вообще сделать что-то подобное с RIA Services или это еще не созрели? Я знаю, что делал это раньше с прямым WCF, но, очевидно, это больше работы.

Спасибо заранее, Кейси

Ответы [ 3 ]

0 голосов
/ 13 февраля 2012

У вас должно получиться сделать это без проблем, но при передаче объекта клиенту служб RIA, вам необходимо указать [Ключ], который гарантированно будет уникальным для всех подобных объектов. Этоэто связано с тем, что службы RIA обрабатывают кэширование этих объектов на стороне клиента.Кроме того, ваш ValueList1Item, ValueList2Item и т. Д. должны быть сериализуемыми .

При такой настройке службы RIA превратят объекты POCO вашего сервера в объекты Entity клиента.Единственная проблема, с которой вы здесь столкнетесь, - вы должны вручную обрабатывать любые операции CUD.Если вы передаете клиенту данные только для чтения, вам не о чем беспокоиться.

0 голосов
/ 16 февраля 2012

Ну, мне удалось стать немного ближе. Добавление ключа к свойству 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

Трассировка этого метода показывает, что он действительно работает нормально Я вижу, что все элементы списка значений заполнены правильно, он просто никогда не покидает сервер. Это наводит меня на мысль, что на данный момент это какая-то проблема сериализации.

0 голосов
/ 13 февраля 2012

(извините за мой плохой английский)

Я пробовал это раньше, и это действительно не работает. Если вы создадите новый класс для ValueList1, он будет работать. Но если по какой-то причине вы используете класс с атрибутом [Key], он не генерируется (свойство не будет отображаться на стороне клиента). Таким образом, одним из решений было бы создать классы, подобные ReadOnlyValueList1, и вернуть его:

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

(извините, код C #, возможно, это немного отличается от VB)

В любом случае, это имеет смысл, поскольку вы не хотите, чтобы весь материал EF (отслеживание и т. Д.) Просто связывал некоторые списки и комбинации.

...