Mettre en cache les données de schéma
Certaines applications bénéficient du maintien d’un cache persistant des définitions de schéma pour une organisation Dataverse. Par exemple :
- Applications qui doivent fonctionner tout en étant déconnectées du serveur Dataverse
- Applications sensibles à la bande passante réseau limitée, telles que les applications mobiles
Dataverse a beaucoup de données de définition de schéma, et peu d’applications doivent les suivre toutes. Limiter la quantité de données à mettre en cache est essentiel.
Le message RetrieveMetadataChanges
offre deux fonctionnalités :
- Requête : composez une seule requête pour récupérer uniquement les données de schéma dont vous avez besoin. La composition de requêtes est abordée dans Définitions du schéma de la requête.
- Gestion du cache : si vous mettez en cache les données de définition de schéma avec votre application, vous pouvez utiliser
RetrieveMetadataChanges
pour récupérer efficacement uniquement les modifications depuis votre dernière requête. Utilisez les informations sur ces modifications pour ajouter ou supprimer des éléments dans votre cache. La mise en cache des données du schéma peut entraîner une amélioration significative du temps de démarrage de votre application et constitue l’objet de cet article.
Après avoir défini une requête pour les données du schéma que vous souhaitez mettre en cache, vous pouvez utiliser d’autres fonctionnalités du message RetrieveMetadataChanges
pour créer et maintenir un cache des données du schéma Dataverse.
Créer un cache
Comme décrit dans Définitions du schéma de la requête, la première étape consiste à créer une requête qui définit le type d’informations sur le schéma qui vous intéresse. Puis utilisez le message RetrieveMetadataChanges
pour exécuter cette requête et mettre en cache les définitions de schéma renvoyées dans votre application. Vous devez trouver un moyen de conserver ces données qui soit adapté aux besoins de votre application. Vous pouvez l’enregistrer en tant que fichier que votre application lit au démarrage. Vous devez également enregistrer les données sur la dernière exécution de la requête.
Structurez votre cache d’une manière qui a du sens pour votre application. Pour gérer la suppression des éléments supprimés, il est important que votre cache utilise MetadataId
comme identificateur unique. Pour plus d’informations : Retirer les articles supprimés.
Détecter les changements
Aucun événement n’est disponible pour détecter quand des modifications de la définition du schéma se produisent. Les besoins de votre application doivent motiver l’actualisation du cache. Les utilisateurs récupèrent généralement les modifications au démarrage de l’application. Mais vous pouvez interroger le système régulièrement si vous souhaitez détecter les changements au fil du temps. Quelle que soit votre stratégie, il est important de garder une trace de l’heure à laquelle vous avez envoyé la demande précédente.
La propriété RetrieveMetadataChangesResponse.ServerVersionStamp
contient des informations sur le moment où la demande de RetrieveMetadataChanges
a eu lieu. Vous devez prendre la valeur ServerVersionStamp
de la réponse précédente et l’utiliser comme valeur pour RetrieveMetadataChangesRequest.ClientVersionStamp
lorsque vous l’envoyez à nouveau en utilisant la même requête.
Lorsque vous incluez la propriété ClientVersionStamp
dans la demande, la propriété RetrieveMetadataChangesResponse.EntityMetadata
renvoyée contient uniquement les données du schéma modifiées ou ajoutées depuis la demande précédente. Vous pouvez les ajouter à votre cache.
Si vous incluez également le paramètre DeletedMetadataFilters
, tous les éléments du schéma supprimés depuis la demande précédente sont inclus dans la propriété RetrieveMetadataChangesResponse.DeletedMetadata
. Vous pouvez les retirer de votre cache.
Ce résultat doit être plus petit et plus rapide que la réexécution de la requête d’origine.
Gérer le cache expiré
Les informations sur les modifications sont stockées pendant 90 jours par défaut. Cette valeur est stockée dans la propriété Organization.ExpireSubscriptionsInDays. Si vous envoyez une demande avec une valeur ClientVersionStamp
plus ancienne que la valeur du paramètre, Dataverse renvoie une erreur ExpiredVersionStamp
(0x80044352
). Vous devez être prêt à gérer cette erreur spécifique et à réinitialiser votre cache lorsqu’elle se produit.
Notes
Vous devez être prêt à gérer cette erreur même si vous pensez que votre valeur est toujours inférieure à 90 jours. Cette erreur est générée lorsque des modifications sur le serveur ont un impact sur le suivi précis des données de schéma supprimées. Par exemple, changer la propriété Organization.ExpireSubscriptionsInDays
invalidera toutes les valeurs VersionStamp
précédentes. Certaines de ces modifications peuvent ne pas être causées par des actions que vous entreprenez, mais peuvent être déclenchées par la maintenance du système.
Ajouter des éléments modifiés
Tout comme lorsque vous exécutez votre requête initiale pour initialiser votre cache, la propriété RetrieveMetadataChangesResponse.EntityMetadata
renvoyée pour les demandes ultérieures utilisant RetrieveMetadataChangesRequest.ClientVersionStamp
inclut la hiérarchie complète des éléments modifiés.
Chaque élément de la hiérarchie a une valeur HasChanged
booléenne définie sur Nullable. Lorsque cette valeur est false, cela signifie que l’élément actuel n’a pas changé, mais que quelque chose en dessous dans la hiérarchie a changé. Quand la valeur HasChanged
est définie sur true, cela signifie que l’élément actuel dans la hiérarchie a changé.
Notes
Si vous demandez EntityMetadata.Privileges
dans votre requête, les privilèges sont toujours renvoyés, qu’ils aient changé ou non. Les privilèges ne changent généralement pas.
Options de suivi
Une zone qui peut ne pas sembler intuitive est la façon dont les options pour les colonnes de choix sont suivies. Cette zone est un bon exemple pour comprendre la propriété HasChanged
.
Lorsqu’une nouvelle option est ajoutée à une colonne de choix, les données suivantes dans la hiérarchie seront renvoyées avec la propriété RetrieveMetadataChangesResponse.EntityMetadata
:
- EntityMetadataCollection
- EntityMetadata : la définition de la table.
- EntityMetadata.Attributes[]
- EnumAttributeMetadata : la classe de base pour les colonnes Choice.
- EnumAttributeMetadata.OptionSet
- OptionSetMetadata :
HasChanged
a la valeur true.- OptionSetMetadata.Options : toutes les options sont renvoyées.
- OptionMetadata
- OptionMetadata.Color : seule la nouvelle option a une valeur, si elle est définie.
- OptionMetadata.Label : seule la nouvelle option a une valeur.
- OptionMetadata.Value : a toujours une valeur.
- OptionMetadata.HasChanged : la valeur est nulle.
- OptionMetadata
- OptionSetMetadata.Options : toutes les options sont renvoyées.
- OptionSetMetadata :
- EnumAttributeMetadata.OptionSet
- EnumAttributeMetadata : la classe de base pour les colonnes Choice.
- EntityMetadata.Attributes[]
- EntityMetadata : la définition de la table.
Vous savez que EntityMetadata
et EnumAttributeMetadata
n’ont pas été modifiés parce que la propriété HasChanged
a la valeur false. Seule la propriété OptionSetMetadata.HasChanged
a la valeur true. Toutes les options valides actuelles sont renvoyées. La propriété OptionMetadata.HasChanged
pour toutes les options, y compris la nouvelle, est nulle.
Seule l’option nouvellement créée contient des données pour la propriété Label
. La propriété OptionMetadata.HasChanged
a la valeur true uniquement lorsque l’une de ses propriétés (comme Color
ou Label
) est modifiée.
Retirer les éléments supprimés
Lorsque vous incluez les paramètres ClientVersionStamp
et DeletedMetadataFilters
pour un message RetrieveMetadataChanges
, la propriété RetrieveMetadataChangesResponse.DeletedMetadata
contient des données sur tous les éléments supprimés. Cette propriété est une DeletedMetadataCollection
qui contient un ensemble de Keys
et Values
. Les clés sont des valeurs d’énumération DeletedMetadataFilters
et vous pouvez utiliser ces valeurs pour accéder à un sous-ensemble des valeurs supprimées.
Notes
Le paramètre DeletedMetadataFilters
est facultatif et il y a un impact sur les performances lorsque vous l’incluez, car les données sont extraites directement de la base de données plutôt que du cache interne. Utilisez-le uniquement lorsque vous devez détecter des éléments supprimés et définissez la valeur du filtre sur la quantité minimale de données que vous devez renvoyer.
Les valeurs supprimées sont renvoyées sous la forme d’une collection de valeurs Guid
. Les valeurs des éléments supprimés ne sont pas filtrées en fonction de votre requête. De nombreuses valeurs Guid
ne figurent pas dans votre cache, mais les valeurs Guid
de votre élément mis en cache sont incluses. Vous devez rechercher toute valeur Guid
correspondante et supprimer ces éléments. Ignorez toutes les valeurs qui ne sont pas présentes dans votre cache.
Notes
La définition de l’API web DeletedMetadataFilters EnumType est légèrement différent du kit de développement logiciel DeletedMetadataFilters Enum.
L’API web DeletedMetadataFilters EnumType n’a pas le membre Entity
. Vous devez utiliser à la place Default
.
Options de suivi des suppressions
Remarquez que DeletedMetadataFilters
enum contient un membre pour OptionSet
, mais pas d’option. Si des options sont supprimées d’une colonne de choix, vous ne trouverez pas de référence à une option spécifique qui a été supprimée. Vous devez accéder à vos options mises en cache et les comparer aux options actuelles renvoyées pour OptionSet
.
Voir aussi
Exemple d’API web Rechercher les définitions de schéma et détecter les modifications (C#)
Exemple de SDK Rechercher les définitions de schéma et détecter les modifications (C#)
Rechercher les définitions de schéma
Notes
Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)
Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).