0

Допустим, у меня есть список сущностей (например, список элементов TODO), которые могут изменять, удалять и добавлять одновременно несколько пользователей.Как реализовать «получить замененные элементы latests» с помощью служб данных ADO.NET?

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

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

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

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

Любые входные данные будут очень восприимчивыми.

С уважением, Egil.

ответ

1

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

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

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

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

EDIT: вам не нужно отдельно сохранять номер поколения, вы можете использовать функцию sql MAX над столбцом генерации.

+0

Спасибо за вход Кристофер. Ваша идея, безусловно, будет работать, но я хотел бы сохранить управление изменениями из базы данных, в моем мире это связано с клиентом и не имеет особого отношения к данным. –

+0

Возможно, вы могли бы использовать в основном ту же схему без использования БД путем кэширования набора результатов в global.asax и добавления поля генерации и т. Д. К набору результатов там. Затем вы можете кэшировать номер поколения клиента в сеансе или в JS для получения обновлений/вставок/удалений. –

+0

Мне нужно хранить данные в базе данных, но если бы я мог каким-то образом изменить набор результатов на лету, было бы здорово. Я не уверен, как EF позволяет мне это делать. –