2012-02-13 10 views
0

私は自分の問題に対処する方法についてネット全体を検索してきましたが、私は運が全くありませんでした。私はSilverlightビジネスクラスのアプリケーションを開発しており、RIAサービスを利用しようとしています。私は正常に読み込んで、主要な問題なしでエンティティを保存していますが、アプリケーションが最初に読み込まれるときに私が "値リスト"と呼んでいるものをロードする必要があります。Silverlight/RIA Services/EF - カスタムオブジェクト

私の値リストは、Id(キー)とValue'sで構成された独立したエンティティで、おそらく5程度で、コンボボックスやオートコンプリートボックスのようなものを埋め込むために使用されます。私は個々にそれぞれを照会することができますが、1つのクエリですべての値リストを一度にロードして、それぞれのレコードが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でこれをやったことは分かっていますが、それは明らかに多くの仕事です。事前に

おかげで、 ケーシー

答えて

0

(私の悪い英語のため申し訳ありません)

は私が前にこれを試してみましたが、それは実際に動作しません。 ValueList1の新しいクラスを作成すると動作します。しかし、何らかの理由で[Key]属性のクラスを使用した場合、それは生成されません(プロパティはクライアント側に表示されません)。だから、一つの解決策は、ReadOnlyValueList1のようなクラスを作成し、それを返すために、次のようになります。

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

を(申し訳ありませんが、C#のコード、おそらくこれはVBで少し異なります)

あなたはすべてしたくないので、それはとにかく意味をなさないいくつかのリストとコンボをバインドするためだけのEF stuff(トラッキングなど)。

+0

返信いただきありがとうございます。私はチャンスを得るとすぐにそれを試して、それが動作するかどうかを見てみましょう。私はすぐにRIAサービスを投げ捨てることになり、このような問題に苦しんでいけば、通常のWCFの実装に直接進むことができます。私はWCFがより多くの仕事をしていることは知っていますが、確かにはるかに柔軟性があり、いいですね。この時点では、RIA Servicesはかなり高いレベルの複雑さを持つアプリケーションに最適なソリューションではないという印象を受けますが、おそらく私はそれについて間違っています。 – Casey

+0

さて、私はまだこのレオには運がありません。私は実際には、ユーザーがこれらの値リストを編集できる「システム」ページを持つため、エンティティだけを読み込むことは望ましくありません。 – Casey

0

あなたは、オブジェクトのようにすべての間で一意であることが保証されている[キー]を指定する必要が、問題なくこれを行うことができるが、RIAサービスのクライアントにオブジェクトを渡すときにすべきです。これは、RIAサービスがクライアント側でこれらのオブジェクトをキャッシュする方法によるものです。また、ValueList1Item、ValueList2Itemなどはシリアル化可能である必要があります

このように設定すると、RIAサービスはサーバーのPOCOオブジェクトをクライアントのEntityオブジェクトにします。ここで実行する唯一の問題は、CUD操作を手動で処理する必要があることです。クライアントに渡す読み取り専用データの場合は、何も心配する必要はありません。

+0

推奨Derreckとして私はKey属性をDTOのIdプロパティに追加しました。これはランダムに生成された数字です。今回は正しくコンパイルされましたが、それはまだフィドラーに従ってデータを送信しません。私はこの時点で、RIAサービスをダンプし、標準のWCF実装に行くつもりだと思います。はい、開発には時間がかかりますが、柔軟性ははるかに優れています。私はすでにWCFを理解していますので、最終的にはよりスムーズになり、おそらくもっと速くなります。これまでのところ、私はIQueryableのファンではなく、問題なくリストを使用できるWCFを知っています。 – Casey

+0

あなたがその方法を使用しているなら、私はIQueryablesを使用しても構いません。配列やリストを使うだけです。それを働かせるのは簡単ではないので、私はあなたの不満を理解することができます。私は1年以上にわたってRIAサービスを利用してきましたが、私の意見では作業が必要なことがたくさんあります。 IQueryableの代わりに配列やリストを使用して別のショットを作成した場合は、それがどのように機能するか教えてください。 –

0

私はもう少し近づくことができました。リターンオブジェクトの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 

は、それが正常に動作して実際には示しています。ここではクラスがあります。私はすべての値リスト項目が適切に設定されているのを見ることができます。これは、この時点で何らかのシリアライゼーションの問題であると信じさせてくれます。

関連する問題