2011-12-03 13 views
5

クライアントサイドでデータを更新するためにWCF RIAサービスを再度呼び出すのに問題があります。ここに私の場合です:サーバ側でwcf riaサービスでクライアント側のエンティティのインスタンスをリフレッシュするにはどうすればよいですか?

、ドメインサービスのようなものです:

クライアント側では
public IQueryable<Person> GetPersonByID(int id) 
     { 
      var result = this.ObjectContext.Persons. 
       Where(e => e.PersonID == id); 
      return result; // check point 1 
     } 

、私は(次のように呼び出しを行い、これは私が「リフレッシュと呼ばれるボタンで呼び出しです「ボタン):

は、データがpersonID=1Age = 16を言うと、私はDB内の人を持っていると仮定します。ここでは

this._amsService.Context.Load<Person>(
    this._amsService.Context.GetPersonByIDQuery(this.Person.ID), 
    LoadBehavior.RefreshCurrent, 
    result => 
    { 
     this.Person = result.Entities.FirstOrDefault(); //check point 2 
     this.RaisePropertyChanged("Person");  

    }, null); 

は私がしようとしているものです

  1. 次に、アプリケーションを実行すると、正しい方法でデータが取得されます。

  2. データベースに移動し、データをSQLで更新してAge = 20に変更します。

  3. アプリに戻って「更新」ボタンをクリックして新しい電話をかけるが、年齢は20に更新されず、まだ16です。

私がデバッグモードでアプリケーションを実行し、データを確認してください。

チェックポイント1で、私は結果のデータを確認し、それが、Age = 20結構です。

チェックポイント2で、私はresult.Entitiesのデータをチェックし、データはリフレッシュされていません。まだそれはAge = 16です。

私はLoadBehavior.MergeIntoCurrent,LoadBehavior.RefreshCurrentを試しましたが、成功しませんでした。

SLアプリケーション全体をリロードするには、SLアプリケーションのホストページを更新する必要があります。新しいデータが表示されます。これはエンドユーザーには受け入れられません。

なぜか分かりません。私はまた、更新ボタンをクリックすると、データをキャッチするためにフィドラーを使用しようとすると、データは最新Age = 20を得た。

この問題を解決するにはどうすればよいですか?

+0

明確にするには、 "this.RaisePropertyChanged(" Person ");"でブレークポイントを設定するとどうなりますか? –

+0

サーバー側のコードをデバッグして、そのコードが返すものを確認できますか?エンティティがサーバー側のセッションにキャッシュされていると、データが更新されていない可能性があります。また、クライアント側でpersonプロパティを再設定する必要はなく、クエリを実行するだけでRIAサービスは現在の人物のageプロパティ変更イベントを発生させます。 – Tevin

+0

私はあなたがサーバー側にsubmitchanges()を追加する必要があると思います –

答えて

0

まず、編集モードのエンティティですか?エンティティが編集モードの場合、RIAは変更を保持し、エンティティを再度ロードするときにのみ元の値を更新します。

あなたのPersonエンティティのIsEditingプロパティで調べることができます。エンティティのOriginalValueをチェックしようとします。 var original = Person.GetOriginal()

関連する問題