Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 die Verbindung vom Dataverse-Server getrennt wird.
- Anwendungen, die bei eingeschränkter Netzwerkbandbreite empfindlich sind, 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
RetrieveMetadataChangeseffizient 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, verwenden Sie andere Funktionen der RetrieveMetadataChanges Nachricht, um einen Cache von Dataverse-Schemadaten zu erstellen und zu verwalten.
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. Hier finden Sie eine Möglichkeit, diese Daten beizubehalten, die für die Anforderungen Ihrer App geeignet sind. 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 finden Sie unter "Entfernen gelöschter Elemente".
Änderungen erkennen
Es ist kein Ereignis vorhanden, um zu erkennen, wann Schemadefinitionsänderungen auftreten. Aktualisieren Sie den Cache basierend auf den Anforderungen Ihrer Anwendung. In der Regel rufen Sie Ä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. Behalten Sie unabhängig von Ihrer Strategie im Auge, wann Sie die vorherige Anfrage gesendet haben.
Die RetrieveMetadataChangesResponse.ServerVersionStamp-Eigenschaft enthält Informationen über den Zeitpunkt, an dem die Anfrage an RetrieveMetadataChanges aufgetreten ist. Verwenden Sie den ServerVersionStamp Wert aus der vorherigen Antwort und verwenden Sie ihn als Wert für RetrieveMetadataChangesRequest.ClientVersionStamp, wenn Sie ihn 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 ist kleiner und schneller als das erneute Ausführen der ursprünglichen Abfrage.
Abgelaufenen Cache verwalten
Dataverse speichert Standardmäßig Informationen zu Änderungen für 90 Tage. Dieser Wert wird in der Organization.ExpireSubscriptionsInDays-Eigenschaft gespeichert. Wenn Sie eine Anforderung mit einem ClientVersionStamp Wert senden, der älter als der Einstellungswert ist, gibt Dataverse einen ExpiredVersionStamp Fehler (0x80044352) zurück. Bereiten Sie sich darauf vor, diesen spezifischen Fehler zu behandeln, und initialisieren Sie den Cache erneut, wenn er auftritt.
Anmerkung
Seien Sie darauf vorbereitet, mit diesem Fehler umzugehen, auch wenn Sie der Meinung sind, dass Ihr Wert immer unter 90 Tagen liegt. Dieser Fehler tritt auf, wenn sich änderungen auf dem Server auf die genaue Nachverfolgung gelöschter Schemadaten auswirken. Wenn Sie beispielsweise die Organization.ExpireSubscriptionsInDays Eigenschaft ändern, werden alle vorherigen VersionStamp Werte ungültig. Einige dieser Änderungen werden möglicherweise nicht durch Aktionen verursacht, die Sie ausführen, aber durch die Systemwartung ausgelöst werden.
Geänderte Elemente hinzufügen
Genau wie bei der Ausführung der anfänglichen Abfrage zur Initialisierung Ihres Caches enthält die von RetrieveMetadataChangesResponse.EntityMetadata für nachfolgende Anfragen mit RetrieveMetadataChangesRequest.ClientVersionStamp zurückgegebene Eigenschaft 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, aber etwas darunter in der Hierarchie geändert wurde. Wenn der HasChanged Wert "true" ist, bedeutet dies, dass das aktuelle Element in der Hierarchie geändert wurde.
Anmerkung
Wenn Sie eine Anfrage mit EntityMetadata.Privileges in Ihrer Abfrage stellen, werden die Berechtigungen immer zurückgegeben, unabhängig davon, ob sie sich geändert haben oder nicht. Rechte ändern sich normalerweise nicht.
Nachverfolgungsoptionen
Ein Bereich, in dem das Nachverfolgen von Änderungen möglicherweise nicht sofort verständlich ist, ist die Art und Weise, wie Optionen für Auswahlspalten erfasst werden. Dieser Bereich ist ein gutes Beispiel zum Verständnis der HasChanged-Eigenschaft.
Wenn Sie einer Auswahlspalte eine neue Option hinzufügen, werden die folgenden Daten in der Hierarchie über die RetrieveMetadataChangesResponse.EntityMetadata Eigenschaft zurückgegeben:
-
EntityMetadataCollection
-
EntityMetadata: Die Tabellendefinition.
-
EntityMetadata.Attributes[]
-
EnumAttributeMetadata : Die Basisklasse für Auswahl-Spalten.
-
EnumAttributeMetadata.OptionSet
-
OptionSetMetadata:
HasChangedist 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 sich EntityMetadata und EnumAttributeMetadata nicht geändert haben, weil die HasChanged-Eigenschaft falsch ist. 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 eine seiner Eigenschaften (wie Color oder Label) geändert wird.
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.
Anmerkung
Der Parameter DeletedMetadataFilters ist optional. Das Einbeziehen kann die Leistung beeinträchtigen, da der Prozess Daten direkt aus der Datenbank abruft, anstatt aus dem internen Cache. 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. Viele Guid Werte befinden sich nicht im Cache, 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.
Anmerkung
Die Definition der Web-API DeletedMetadataFilters EnumType unterscheidet sich geringfügig von der SDK-DeletedMetadataFilters Enum.
Die Web-API DeletedMetadataFilters EnumType hat kein Entity-Mitglied. Verwenden Sie stattdessen Default.
Nachverfolgen gelöschter Optionen
Beachten Sie, dass die DeletedMetadataFilters-Aufzählung ein Mitglied für OptionSet aber keine Option enthält. Wenn Sie Optionen aus einer Auswahlspalte entfernen, 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 Schema-Definitionen im .NET SDK und das Erkennen von Änderungen (C#)
Abfrageschemadefinitionen