Как реализовать «получение последних измененных элементов» с помощью служб данных ADO.NET?

StackOverflow https://stackoverflow.com/questions/720985

Вопрос

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

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

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

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

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

Любой вклад будет очень признателен.

С уважением, Эгиль.

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top