2010-11-23 22 views
7

ハウディー、よろしく! StackOverflowの最初の質問! :-)WCF RIAサービスの呼び出しメソッドのパラメータとしてエンティティを使用する代わりの方法

これはシナリオです:私たちはSilverlight 4でWebアプリケーションを開発しており、WebサービスにはWCF RIA Services 1.0 SP1 Betaを使用しています。私はエンティティフレームワークデザイナーで自分のエンティティを持っていますが、私はわずかに変更されたADO.NETのC#POCOエンティティジェネレータのテンプレートを使用してクラスを生成しています。私がやりたいのは何

は、以下の署名でドメインサービス内のメソッドを持っている:

[EnableClientAccess] 
public class ResultService : DomainService 
{ 
    [Invoke] 
    public SerializableResult CalculateResult(EntityOne e1, EntityTwo e2); 
} 

私はそうのように、他のサービス内のクエリを介してクライアントにEntityOneとEntityTwoの両方を返しています:

[EnableClientAccess] 
public class EntityOneService : DomainService 
{ 
    public IQueryable<EntityOne> GetEntityOnes(); 
} 

[EnableClientAccess] 
public class EntityOneService : DomainService 
{ 
    public IQueryable<EntityTwo> GetEntityTwos(); 
} 

これらのクラスが正常にSilverlightのプロジェクトで生成されています。 SerializableResultはではなく、にキーがあります。

コンパイルしようとすると、「CalculateResult」という名前の操作が必要なシグネチャに準拠していません。パラメータ型は、エンティティまたは複合型、複合型のコレクション、またはあらかじめ定義されたシリアライズ可能なタイプ "

私の研究では、私が見つけた最も有用な情報はthis post by Jeff Handleyのコメントにありました。注目すべきは

は、ピーターはコメントで尋ねた:

I get an 'does not conform to the required signature ...' compile error if my complex object has an [Key] Attribute. When I remove this attribute I can use the object as parameter for an Invoke operation.

ジェフの応答:任意のさらなる努力が無駄になります動作するように私の方法を取得しようとするかのように

This is by design. Complex objects cannot have Key properties. If you have a Key the class gets treated as an Entity.

だから、それは聞こえるが。しかし、誰かがこの問題を抱えているのか、それを解決するために何をしたのだろうと私は思っていました。

ありがとうございました!

+0

クライアントでSerializableResultが生成されていますか?これが私たちのComplex Type IDのバグかどうか疑問に思っています.SequentializableResult型をエンティティのプロパティとして浮上させてからInvokeの結果として使用する必要があるかもしれません。 –

+0

私が試してみると、 "[Invoke] public SerializableResult CalculateResult();"、クライアントでSerializableResult _is_が生成されました。 –

+0

それからエンティティの形をしたもののように聞こえます。 EntityOneとEntityTwoはエンティティから派生して生成されますか? –

答えて

6

答えのための氏ジェフ・ハンドリー氏ディネッシュKulkarniさんに感謝(Twitterを介して)。

エンティティを呼び出しメソッドでパラメータとして使用するには、そのEntityを同じDomainService内に存在するクエリメソッドを通じて公開する必要があります。この制限のための意図は

"Each domain service needs to be able to stand on its own."

(例えばジェフの答えを参照)2つのダミークエリメソッドを追加することで、私は私のコードをコンパイルすることができたということです。

8

私には以下があり、それは私のために働きます。

namespace BusinessApplication2.Web 
{ 
    using System.ComponentModel.DataAnnotations; 
    using System.Linq; 
    using System.ServiceModel.DomainServices.Hosting; 
    using System.ServiceModel.DomainServices.Server; 

    [EnableClientAccess()] 
    public class DomainService1 : DomainService 
    { 
     public IQueryable<EntityOne> GetEntityOnes() 
     { 
      return null; 
     } 

     public IQueryable<EntityTwo> GetEntityTwos() 
     { 
      return null; 
     } 

     [Invoke] 
     public SerializableResult GetSerializableResult(EntityOne one, EntityTwo two) 
     { 
      return new SerializableResult() { Result = "It woooooorrrked!" }; 
     } 
    } 

    public class EntityOne 
    { 
     [Key] 
     public int Id { get; set; } 
    } 

    public class EntityTwo 
    { 
     [Key] 
     public int Id { get; set; } 
    } 

    public class SerializableResult 
    { 
     public string Result { get; set; } 
    } 
} 
+0

したがって、CalculateResultメソッドを使用して、DomainServiceに2つのダミーのQueryメソッドを追加しました(IQueryable およびIQueryable を返す)、今コンパイルされました。なぜ元の方法でコンパイルしないのですか? –

+0

これは、ドメインサービス間でエンティティタイプを操作できる「共有エンティティ」機能のバグである可能性があります。私はそれを提出し、それが設計上のものか実際はバグかを知らせます。 –

+0

ありがとうございます! –

関連する問題