Cache-Schemadaten
Einige Anwendungen profitieren von der Verwaltung eines dauerhaften Caches von Schemadefinitionen für eine Dataverse-Organisation. Zum Beispiel:
- Anwendungen, die funktionieren müssen, während keine Verbindung zum Dataverse-Server besteht
- Anwendungen, die empfindlich auf begrenzte Netzwerkbandbreite reagieren, z. B. mobile Anwendungen
Dataverse hat viele Schemadefinitionsdaten, und nur wenige Anwendungen müssen sie alle nachverfolgen. Es ist wichtig, die Datenmenge zu begrenzen, die zwischengespeichert werden soll.
Die RetrieveMetadataChanges
-Nachricht bietet zwei Möglichkeiten:
- Anfrage: Erstellen Sie eine einzelne Abfrage, um nur die Schemadaten abzurufen, die Sie benötigen. Das Erstellen von Abfragen wird in den Abfrageschemadefinitionen behandelt.
- Cache-Verwaltung: Wenn Sie die Schemadefinitionsdaten mit Ihrer App zwischenspeichern, können Sie mit
RetrieveMetadataChanges
effizient nur die Änderungen seit Ihrer letzten Abfrage abrufen. Verwenden Sie die Informationen zu diesen Änderungen, um Elemente in Ihrem Cache hinzuzufügen oder zu entfernen. Das Zwischenspeichern von Schemadaten kann die Startzeit Ihrer Anwendung erheblich verkürzen und steht im Mittelpunkt dieses Artikels.
Nachdem Sie eine Abfrage für die Schemadaten definiert haben, die Sie zwischenspeichern möchten, können Sie andere Funktionen der RetrieveMetadataChanges
-Nachricht zum Erstellen und Verwalten eines Cache von Dataverse-Schemadaten verwenden.
Einen Cache erstellen
Wie in Abfrageschemadefinitionen beschrieben besteht der erste Schritt darin, eine Abfrage zu erstellen, die die Art der Schemainformationen definiert, an denen Sie interessiert sind. Dann nutzen Sie die RetrieveMetadataChanges
-Nachricht, um diese Abfrage auszuführen und die in Ihrer Anwendung zurückgegebenen Schemadefinitionen zwischenzuspeichern. Sie sollten eine Möglichkeit finden, diese Daten beizubehalten, die für die Anforderungen Ihrer App geeignet ist. Sie können sie als Datei speichern, die Ihre Anwendung beim Start liest. Sie müssen auch Daten über den letzten Ausführungszeitpunkt der Abfrage speichern.
Strukturieren Sie Ihren Cache so, wie es für Ihre Anwendung sinnvoll ist. Um das Entfernen gelöschter Elemente zu verwalten, ist es wichtig, dass Ihr Cache die MetadataId
als eindeutige Kennung verwendet. Weitere Informationen: Entfernen gelöschter Elemente.
Änderungen erkennen
Es ist kein Ereignis verfügbar, um zu ermitteln, wann Schemadefinitionsänderungen auftreten. Die Anforderungen Ihrer Anwendung sollten die Aktualisierung des Caches erfordern. Normalerweise rufen Personen Änderungen ab, wenn die Anwendung gestartet wird. Sie können das System jedoch regelmäßig abfragen, wenn Sie Änderungen im Laufe der Zeit erkennen möchten. Unabhängig von Ihrer Strategie ist es wichtig, den Zeitpunkt der vorherigen Anfrage im Auge zu behalten.
Die RetrieveMetadataChangesResponse.ServerVersionStamp
-Eigenschaft enthält Informationen über den Zeitpunkt, an dem die Anfrage an RetrieveMetadataChanges
aufgetreten ist. Sie müssen den ServerVersionStamp
-Wert aus der vorherigen Antwort nehmen und ihn als Wert für RetrieveMetadataChangesRequest.ClientVersionStamp
verwenden, wenn Sie das Element erneut mit derselben Abfrage senden.
Wenn Sie die ClientVersionStamp
-Eigenschaft in der Anfrage einschließen, enthält die zurückgegebene Eigenschaft RetrieveMetadataChangesResponse.EntityMetadata
nur die seit der letzten Anforderung geänderten oder hinzugefügten Schemadaten. Sie können sie Ihrem Cache hinzufügen.
Wenn Sie auch den DeletedMetadataFilters
-Parameter einschließen, werden alle Schemaelemente, die seit der letzten Anforderung gelöscht wurden, in der Eigenschaft RetrieveMetadataChangesResponse.DeletedMetadata
eingeschlossen. Sie können sie aus Ihrem Cache entfernen.
Dieses Ergebnis sollte kleiner und schneller sein, als wenn die ursprüngliche Abfrage erneut ausgeführt würde.
Abgelaufenen Cache verwalten
Informationen über Änderungen werden standardmäßig 90 Tage gespeichert. Dieser Wert wird in der Organization.ExpireSubscriptionsInDays-Eigenschaft gespeichert. Wenn Sie eine Anforderung mit einem ClientVersionStamp
-Wert senden, der älter ist als der Einstellungswert, gibt Dataverse einen ExpiredVersionStamp
-Fehler (0x80044352
) zurück. Sie sollten darauf vorbereitet sein, diesen speziellen Fehler zu beheben und Ihren Cache neu zu initialisieren, wenn er auftritt.
Hinweis
Sie sollten darauf vorbereitet sein, diesen Fehler zu bewältigen, auch wenn Sie glauben, dass Ihr Wert immer weniger als 90 Tage betragen wird. Dieser Fehler wird ausgegeben, wenn sich Änderungen auf dem Server auf die genaue Nachverfolgung gelöschter Schemadaten auswirken. Zum Beispiel macht das Ändern der Organization.ExpireSubscriptionsInDays
-Eigenschaft alle vorherigen VersionStamp
-Werte ungültig. Einige dieser Änderungen werden möglicherweise nicht durch von Ihnen vorgenommene Aktionen verursacht, sondern können durch Systemwartungen ausgelöst werden.
Geänderte Elemente hinzufügen
Genau wie beim ersten Abfragen zum Initialisieren des Caches umfasst die Eigenschaft RetrieveMetadataChangesResponse.EntityMetadata
, die für nachfolgende Anforderungen mithilfe von RetrieveMetadataChangesRequest.ClientVersionStamp
zurückgegeben wird, die vollständige Hierarchie der geänderten Elemente.
Jedes Element in der Hierarchie hat einen nullbaren booleschen HasChanged
-Wert. Wenn dieser Wert falsch ist, bedeutet dies, dass sich das aktuelle Element nicht geändert hat, sich aber etwas darunter in der Hierarchie geändert hat. Wenn der HasChanged
-Wert wahr ist, bedeutet dies, dass sich das aktuelle Element in der Hierarchie geändert hat.
Hinweis
Wenn Sie EntityMetadata.Privileges
in Ihrer Abfrage anfordern, werden die Rechte immer zurückgegeben, unabhängig davon, ob sie sich geändert haben oder nicht. Rechte ändern sich normalerweise nicht.
Nachverfolgungsoption
Ein Bereich, der möglicherweise nicht intuitiv erscheint, ist die Art und Weise, wie Optionen für Auswahlspalten nachverfolgt werden. Dieser Bereich ist ein gutes Beispiel zum Verständnis der HasChanged
-Eigenschaft.
Wenn einer Auswahlspalte eine neue Option hinzugefügt wird, werden die folgenden Daten in der Hierarchie mit der RetrieveMetadataChangesResponse.EntityMetadata
-Eigenschaft zurückgegeben:
- EntityMetadataCollection
- EntityMetadata: Die Tabellendefinition.
- EntityMetadata.Attributes[]
- EnumAttributeMetadata : Die Basisklasse für Auswahl-Spalten.
- EnumAttributeMetadata.OptionSet
- OptionSetMetadata:
HasChanged
ist wahr.- OptionSetMetadata.Options: Alle Optionen werden zurückgegeben.
- OptionMetadata
- OptionMetadata.Color: Nur die neue Option hat einen Wert, wenn sie festgelegt ist.
- OptionMetadata.Label: Nur die neue Option hat einen Wert.
- OptionMetadata.Value : Hat immer einen Wert.
- OptionMetadata.HasChanged: Der Wert ist NULL.
- OptionMetadata
- OptionSetMetadata.Options: Alle Optionen werden zurückgegeben.
- OptionSetMetadata:
- EnumAttributeMetadata.OptionSet
- EnumAttributeMetadata : Die Basisklasse für Auswahl-Spalten.
- EntityMetadata.Attributes[]
- EntityMetadata: Die Tabellendefinition.
Sie wissen, dass EntityMetadata
und EnumAttributeMetadata
sich nicht geändert haben, denn die HasChanged
-Eigenschaft ist falsch. Nur die OptionSetMetadata.HasChanged
-Eigenschaft ist wahr. Es werden alle aktuell gültigen Optionen zurückgegeben. Die OptionMetadata.HasChanged
-Eigenschaft für alle Optionen, einschließlich der neuen, ist NULL.
Nur die neu erstellte Option enthält Daten für die Label
-Eigenschaft. Die OptionMetadata.HasChanged
-Eigenschaft ist nur dann wahr, wenn sich eine ihrer Eigenschaften (wie Color
oder Label
) ändert.
Gelöschte Elemente entfernen
Wenn Sie sowohl den Parameter ClientVersionStamp
als auch den Parameter DeletedMetadataFilters
für eine RetrieveMetadataChanges
-Nachricht einschließen, enthält die RetrieveMetadataChangesResponse.DeletedMetadata
-Eigenschaft Daten zu allen gelöschten Elementen. Bei dieser Eigenschaft handelt es sich um ein DeletedMetadataCollection
-Element das eine Reihe von Keys
und Values
enthält. Die Schlüssel sind DeletedMetadataFilters
-Enumerationswerte und Sie können diese Werte verwenden, um auf eine Teilmenge der gelöschten Werte zuzugreifen.
Hinweis
Der DeletedMetadataFilters
-Parameter ist optional, und wenn Sie ihn einbeziehen, wirkt sich dies etwas auf die Leistung aus, da die Daten direkt aus der Datenbank und nicht aus dem internen Cache abgerufen werden. Verwenden Sie ihn nur, wenn Sie gelöschte Elemente erkennen müssen, und setzen Sie den Filterwert auf die Mindestmenge der Daten, die zurückgegeben werden müssen.
Die gelöschten Werte werden als Sammlung von Guid
-Werten zurückgegeben. Die Werte für gelöschte Elemente werden nicht basierend auf Ihrer Abfrage gefiltert. Es gibt viele Guid
-Werte, die sich nicht in Ihrem Cache befinden, aber die Guid
-Werte für Ihr zwischengespeichertes Element sind enthalten. Sie müssen nach übereinstimmenden Guid
-Werten suchen und diese Elemente entfernen. Ignorieren Sie alle Werte, die sich nicht in Ihrem Cache befinden.
Hinweis
Die Definition der Web-API DeletedMetadataFilters EnumType unterscheidet sich geringfügig der SDK-DeletedMetadataFilters-Aufzählung.
Die Web-API DeletedMetadataFilters EnumType hat kein Entity
-Mitglied. Sie müssen stattdessen Default
verwenden.
Nachverfolgung gelöschter Optionen
Beachten Sie, dass die DeletedMetadataFilters
-Aufzählung ein Mitglied für OptionSet
aber keine Option enthält. Wenn Optionen aus einer Auswahlspalte entfernt werden, finden Sie keinen Verweis auf eine bestimmte Option, die gelöscht wurde. Sie müssen zu Ihren zwischengespeicherten Optionen gehen und sie mit den aktuellen Optionen vergleichen, die für dieses OptionSet
zurückgegeben werden.
Siehe auch
Beispiel für das Abfragen von Schemadefinitionen der Web-API und das Erkennen von Änderungen (C#)
Beispiel für das Abfragen von SDK for .NET-Abfrageschemas und das Erkennen von Änderungen (C#)
Abfrageschemadefinitionen
Hinweis
Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)
Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).