0

複数のユーザーが同時に変更、削除、追加できるエンティティのリスト (TODO アイテムのリストなど) があるとします。

したがって、すべてのクライアント間で同期されたリストを維持するには、各クライアント (AJAX ベース) が xx 秒ごとに変更を要求するようにします。リストは非常に長くなる可能性があるため、毎回完全なリクエストを行うのではなく、変更された項目のみを要求します (項目は更新、削除、または新規作成できます)。

ADO.NET Data Services で可能ですか? その場合、サーバーで Entity Framework を使用している場合、どのように実装すればよいですか?

変更操作がデータ サービスに送信されたときに変更項目を格納するために ASP.NETs キャッシュを使用することを検討し、特定のクライアントの最後の要求以降の最新の変更を返すカスタム Web メソッドを用意しました (要求はクライアントを通じて追跡できます)。 ASP.NETs セッション オブジェクト)。ただし、結果セット内の個々のアイテムの変更状態 (削除、更新、挿入など) を示す方法がわかりません。

優れたソリューションは、クライアントがサーバーへの同じラウンドトリップで多くのエンティティの変更を要求できるようにもします。

どんな入力でも大歓迎です。

よろしく、エギル。

4

1 に答える 1

1

私の頭に浮かぶのは、テーブルに世代番号を使用することです。TODOテーブルにgenerationという列を指定し、(精神的に)グローバルで永続的な世代番号変数に関連付けます。(おそらくこれをDBのテーブルに入れるのが最善です)。

更新または挿入が行われるたびに、世代番号が増分され、更新または挿入されたレコードの世代番号列に入れられます。

レコードが最初にDBから読み取られ、Webページに配置されると、現在の世代番号も取得され、ローカルにキャッシュされます(つまり、JavaScript変数に配置されます)。後続のAJAX駆動型読み取りでは、ローカルにキャッシュされた世代番号よりも大きい世代番号のレコードのみをフィルター処理するwhere句を使用します。これにより、新しい更新と削除のみが取得されます。次に、ローカルにキャッシュされた世代番号が更新されます。

削除はもう少し注意が必要です。これを行う1つの方法は、削除されたレコードを限られた期間、たとえば21分間トゥームストーンすることです。トゥームストーンと呼ばれるビット列と日時列があります。レコードが削除されると、挿入または削除と同じ方法で列の世代番号が設定され、トゥームストーンビットが設定され、GetDate()を使用して日時が現在の時刻に設定されます。クライアントのAJAXリクエストは、トゥームストーンフラグが設定されたレコードを選択し、クライアント側のリストからそれらを削除できます。クライアントが20分ごとにページ全体の更新、またはすべてのレコードを取得するajax呼び出しが強制されるようにコーディングされている場合、DBジョブは毎分実行され、20より古いトゥームストーンレコードをクリーンアップ(つまり削除)できます。分。

編集:実際には、世代番号を個別に永続化する必要はありません。世代列に対してSQL関数MAXを使用できます。

于 2009-04-06T12:03:25.337 に答える