0

Disons que j'ai une liste d'entités (par exemple, une liste d'éléments TODO) que plus d'un utilisateur peut modifier, supprimer et ajouter en même temps. Donc, pour maintenir une liste synchronisée entre tous les clients, je veux que chaque client (basé sur AJAX) demande des changements toutes les xx secondes. Comme la liste peut être très longue, je ne veux pas faire une requête complète à chaque fois, mais seulement demander les éléments modifiés (les éléments peuvent être mis à jour, supprimés ou nouveaux).Comment implémenter "get latests a modifié des éléments" avec ADO.NET Data Services?

Est-ce possible avec ADO.NET Data Services? Si oui, comment l'implémenter, si j'utilise Entity Framework sur le serveur? J'ai envisagé d'utiliser le cache ASP.NETs pour stocker les éléments de modification lorsqu'une opération de modification est soumise au service de données et de disposer d'une méthode Web personnalisée qui renverrait les dernières modifications depuis la dernière requête des clients spécifiques (les demandes pouvaient être suivi à travers l'objet de session ASP.NETs clients). Cependant, je n'ai aucune idée de la façon d'indiquer l'état de changement de l'élément individuel (par exemple supprimé ou mis à jour ou inséré) dans le jeu de résultats.

Une excellente solution permettrait également au client de demander des changements dans de nombreuses entités dans le même aller-retour au serveur.

Toute entrée sera très appréciée.

Cordialement, Egil.

Répondre

1

La manière qui me vient à l'esprit est d'utiliser un numéro de génération pour la table. Donnez à la table TODO une colonne appelée génération et associez (mentalement) à celle-ci une variable de nombre de génération globale et persistante. (Probablement préférable de mettre cela dans un tableau dans la DB).

Chaque fois qu'une mise à jour ou une insertion est effectuée, le numéro de génération est incrémenté et placé dans la colonne du numéro de génération pour l'enregistrement mis à jour ou inséré. Lorsque les enregistrements sont d'abord lus à partir du DB et mis sur la page Web, le numéro de génération actuel est également récupéré et mis en cache localement (c'est-à-dire mis dans une variable JavaScript). Les lectures pilotées par AJAX suivantes utilisent une clause where, filtre qui enregistre uniquement avec un numéro de génération supérieur au numéro de génération mis en cache localement. Cela garantit que seules les nouvelles mises à jour et suppressions sont récupérées. Le numéro de génération localement mis en cache est ensuite mis à jour.

Les suppressions sont un peu plus compliquées. Une façon de le faire est de supprimer des enregistrements supprimés pendant une période limitée, disons 21 minutes. Vous avez une colonne bit appelée pierre tombale et une colonne datetime. Lorsqu'un enregistrement est supprimé, la colonne a son numéro de génération défini de la même manière que pour une insertion ou une suppression, le bit de désactivation est défini et le datetime est défini sur l'heure en cours à l'aide de GetDate(). La requête AJAX du client peut alors sélectionner des enregistrements avec l'ensemble d'indicateurs de désactivation et les supprimer de la liste des clients. Si le client est codé de sorte que toutes les 20 minutes une actualisation de page complète, ou un appel ajax qui obtient chaque enregistrement, soit appliqué, un travail DB peut s'exécuter toutes les minutes et nettoyer (supprimer) les enregistrements désactivés de plus de 20 minutes.

EDIT: Vous n'avez pas besoin de conserver le numéro de génération séparément, vous pouvez utiliser la fonction sql MAX sur la colonne de génération.

+0

Merci pour l'entrée Christopher. Votre idée va certainement fonctionner, mais j'aimerais garder la gestion du changement hors de la base de données, dans mon monde, il est lié au client et pas vraiment pertinent pour les données. –

+0

Peut-être que vous pourriez utiliser fondamentalement le même schéma sans utiliser le DB en mettant en cache le jeu de résultats dans global.asax et en ajoutant le champ de génération etc. au jeu de résultats là. Vous pouvez ensuite mettre en cache le numéro de génération du client dans la session ou dans JS pour obtenir les mises à jour/insertions/suppressions. –

+0

J'ai besoin de stocker mes données dans une base de données, mais si je pouvais en quelque sorte modifier le résultat à la volée, ce serait génial. Je ne sais pas comment EF me permet de faire ça. –