2011-12-17 7 views
0

ユーザーがノートを作成し、ノートを画面上で常に動かすことができるアプリケーションのTodoタイプを作成しています。定数の更新と呼び出しサブチェンジ:このエンティティは現在読み取り専用のriaサービスです

このため、一般的なコードは次のとおりです:

private void SaveChanges() 
    { 
     if (!_context.IsSubmitting) 
     { 
      this.busyIndicator.IsBusy = true; 
      _context.SubmitChanges(subOp => 
      { 

       this.busyIndicator.IsBusy = false; 
       if (subOp.Error != null) 
       { 
        ErrorWindow window = new ErrorWindow(subOp.Error.Message); 
        window.Show(); 
       } 

      }, null); 
     } 
    } 

しかし私はbusyindicatorを使用して停止することにより、UIをブロックしています見ることができるように、「ノート」の位置のすべての変更に私はそれをデータベースに保存する必要がありますユーザーは送信中に何らかのアクティビティーを実行する必要があります。これは特にこのアプリケーションでは悪いことです。代替手段として、私はこのコードを使用して、異なるスレッド上にこのコードを移動しようとしたので:

private void SaveChanges() 
    { 
     ThreadPool.QueueUserWorkItem(waitcall => 
     { 
      if (!_context.IsSubmitting) 
      { 
       //this.busyIndicator.IsBusy = true; 
       _context.SubmitChanges(subOp => 
       { 
        Dispatcher.BeginInvoke(() => 
        { 
         //this.busyIndicator.IsBusy = false; 
         if (subOp.Error != null) 
         { 
          ErrorWindow window = new ErrorWindow(subOp.Error.Message); 
          window.Show(); 
         } 
        }); 

       }, null); 
      } 

     }); 
    } 

これは動作し、アプリケーションがまだ応答のまま。しかし、今のコンテキストは、変更を送信され、ユーザーは、エンティティのプロパティを変更するなどの結合試して、画面の周りに移動することによって、同じノートで動作し、私は例外を取得しながら:

このエンティティは現在、読み取り専用です

コンテキストが変更を送信しているため、これは明らかです。しかし、私はダムのビジーインジケータを表示しないで、まだこれらの例外を取得しないでアプリケーションを応答し続けることができる任意の方法はありますか?

+0

を使用すると、すべての変更にサヴァンされているなぜですか?送信前にユーザーが変更を停止するまで待つのはなぜですか? – Yahia

+0

すべての変更を保存すると、「ユーザーはメモを移動しなくなります」という意味でした。ユーザーがメモを移動しなくなったときに保存する必要があります。典型的には、これは何が起こるかである:1)ユーザは音符を動かすことを「止める」2)サブチェンジの火災3)サブチェンジ中に、ユーザは再びノートおよび例外の発火を動かす。 – TCM

+0

あなたのコードのように聞こえるのは、リエントラントでは正しく処理されません...なぜ、最初のサブミットが完了した後で2番目の変更を送信しないのですか? – Yahia

答えて

1

SubmitChanges中に、変更されたプロパティはすべて読み取り専用に設定されます。あなたの場合、それは位置のプロパティです。私はプロパティがノートの位置にバインドされていると推測しています。

Possiblities:

  1. はあなたのDomainContext内のエンティティに結合しないでください。プロパティが変更されたイベント(おそらくエンティティのクローン)を持つクライアントローカルオブジェクトにバインドします。プロパティー変更イベントを使用して、コンテキスト・エンティティーに変更をコピーしようとします。失敗した場合(読み取り専用)、後で再試行するコードを追加することができます。

  2. RIAサービス提供者からEntityGraph partial submitを使用します。 riaservicescontrib.codeplex.com 議論/ブログを確認する - EntityGraphを一時コンテキストに複製し、一時コンテキストを送信するコードが提供されています。私はあなたが完了時に同期することを望んでいないと思います。おそらく、新しい位置を上書きしてウィンドウを飛び越えるからです。ただ提出し、忘れる。 クライアントにエンティティを追加する場合、サーバーから返された自動生成されたキープロパティ(IDなど)が必要です。次に、追加のために一時コンテキスト/部分提出を使用しないでください。 UIをブロックして追加を正常に送信すると、完了したらクライアントプロパティが更新され、キー値が設定される前に部分的なサブミットが呼び出されません。

私は他の可能な解決策に興味があります。

+0

私はあなたのソリューションが好きです。もう1つの解決策は、SubmitChangesを呼び出す代わりにストアドプロシージャを使用することです。 – TCM

0

また、優れ提出操作の数のスレッドセーフ・カウントを維持し、現在の提出操作のコールバックで、次のいずれかをオフにポップアップができます

public static int myPendingSubmitOperationsCount; 
... 
myDataContext.SubmitChanges(mySubmitCallback, null); 
... 
mySubmitCallback(SubmitOperation so) 
{ 
    //Do important stuff 
    if(myPendingSubmitOperationsCount > 0) 
    { 
     myDataContext.SubmitChanges(mySubmitCallback, null); 
     myPendingSubmitOperationsCount -= 1; 
    } 
}