Как реализовать «последние элементы измененных» с ADO.NET Data Services? - PullRequest
0 голосов
/ 06 апреля 2009

Допустим, у меня есть списки объектов (например, список элементов TODO), которые более одного пользователя могут изменять, удалять и добавлять одновременно.

Итак, чтобы создать синхронизированный список всех клиентов, я хочу, чтобы каждый клиент (на основе AJAX) запрашивал изменения каждые XX секунд. Поскольку список может быть очень длинным, я не хочу делать полный запрос каждый раз, а только запрашивать измененные элементы (элементы могут быть обновлены, удалены или новые).

Возможно ли это с помощью служб данных ADO.NET? Если да, то как мне это реализовать, если я использую Entity Framework на сервере?

Я рассмотрел вопрос об использовании кэша ASP.NET для хранения элементов изменений, когда операция изменения передается в службу данных, и имеет собственный веб-метод, который возвращает последние изменения с момента последнего запроса определенных клиентов (запросы могут отслеживаться). через объект сеанса клиентов ASP.NETs). Однако я не знаю, как указать состояние изменения отдельного элемента (например, удален, обновлен или вставлен) в наборе результатов.

Отличное решение также позволило бы клиенту запрашивать изменения во многих объектах в одном и том же обращении к серверу.

Любой вклад будет сильно оценен.

С наилучшими пожеланиями, Эгиль.

1 Ответ

1 голос
/ 06 апреля 2009

Мне кажется, что для таблицы используется номер поколения. Дайте в таблице TODO столбец с именем генерации и (мысленно) свяжите с ней глобальную и постоянную переменную номера генерации. (Вероятно, лучше всего поместить это в таблицу в БД).

Каждый раз, когда производится обновление или вставка, номер поколения увеличивается и помещается в столбец номера поколения для обновленной или вставленной записи.

Когда записи сначала читаются из БД и помещаются на веб-страницу, номер текущего поколения также извлекается и кэшируется локально (т.е. помещается в переменную JavaScript). Последующие AJAX-управляемые операции чтения используют предложение where, которое фильтрует только записи с номером поколения, превышающим локально кэшированный номер поколения. Это обеспечивает получение только новых обновлений и удалений. Затем обновляется локально кэшированный номер поколения.

Удаление немного сложнее. Одним из способов сделать это является захоронение удаленных записей в течение ограниченного периода времени, например, 21 минута. У вас есть битовый столбец с именем tombstone и столбец datetime. Когда запись удаляется, столбец получает номер генерации, установленный так же, как для вставки или удаления, устанавливается бит надгробной плиты, а дата и время устанавливаются на текущее время с помощью GetDate (). Клиентский запрос AJAX может затем выбрать записи с установленным флагом tombstone и удалить их из списка на стороне клиента. Если клиент закодирован так, что через каждые 20 минут выполняется полное обновление страницы или ajax-вызов, который получает каждую запись, тогда задание БД может запускаться каждую минуту и ​​очищать (т.е. удалять) захороненные записи старше 20 лет. минут.

РЕДАКТИРОВАТЬ: на самом деле вам не нужно отдельно сохранять номер поколения, вы можете использовать функцию sql MAX для столбца поколения.

...