Erste Schritte: Speichern von Metadaten
Der Metadaten-Speicherdienst hilft beim Speichern der Synchronisierungsmetadaten für einen Anbieter, der ein Replikat darstellt, das Metadaten andernfalls nicht speichern kann. Der Metadaten-Speicherdienst verwendet eine vereinfachte Datenbank, die einen geringen Bedarf an Speicher- und Festplattenplatz hat, mit dem Anbieter zusammen verteilt werden kann und zuverlässig ist.
Die Metadaten-Speicherdienst-API trennt den Metadatenspeicher klar von den Schnittstellen und Methoden, die für den Zugriff auf den Metadatenspeicher verwendet werden. So können alternative Speicher mit minimalen Änderungen am Anbieter implementiert und verwendet werden.
Hinweis
Die Metadaten-Speicherdienst-Schnittstellen verwenden nur einen Thread. Jeder Thread kann aufgerufen werden. Eine Multithreadanwendung muss bei der Verwendung dieser Schnittstellen jedoch die entsprechende Threadsynchronisierung bereitstellen.
Erstellen des Metadatenspeichers
Der Metadaten-Speicherdienst stellt eine Implementierung der API bereit, die eine kleine Datenbank zum Speichern der Metadaten in einer Datei verwendet.
Verwalteter Code Ein Metadatenspeicher wird durch ein SqlMetadataStore-Objekt dargestellt. Dieses Objekt erweitert die abstrakte MetadataStore-Klasse. Neben den Methoden der Basisklasse zur Verarbeitung von Replikatmetadaten und Transaktionen stellt SqlMetadataStore Methoden zum Erstellen und Öffnen des Metadatenspeichers zur Verfügung. Um einen neuen Speicher zu erstellen, rufen Sie CreateStore auf. Um einen vorhandenen Speicher zu öffnen, rufen Sie OpenStore auf.
Nicht verwalteter Code Ein Metadatenspeicher wird durch ein ISqlSyncMetadataStore-Schnittstellenobjekt dargestellt. Dieses Objekt erweitert die ISyncMetadataStore-Schnittstelle. Neben den Methoden der Basisschnittstelle zur Verarbeitung von Replikatmetadaten und Transaktionen stellt ISqlSyncMetadataStore Methoden zum Erstellen und Öffnen des Metadatenspeichers zur Verfügung. Um ein ISqlSyncMetadataStore-Objekt zu erstellen, übergeben Sie CLSID_SyncMetadataStore und IID_ISqlSyncMetadataStore an CoCreateInstance. Um einen neuen Speicher zu erstellen, rufen Sie ISqlSyncMetadataStore::CreateStore auf. Um einen vorhandenen Speicher zu öffnen, rufen Sie ISqlSyncMetadataStore::OpenStore auf.
Sicherheit Hinweis |
---|
Die Metadatendatei ist nicht gegen nicht autorisierten Zugriff gesichert. Um die Metadatendatei zu schützen, muss der sie enthaltende Ordner ordnungsgemäß gesichert sein. Dies kann z. B. durch Verwendung einer freigegebenen Zugriffssteuerungsliste (Discretionary Access Control List, DACL) erfolgen. Wenn die Metadatendatei an einem Remotestandort gespeichert wird, muss der Kommunikationskanal zwischen dem Metadaten-Speicherdienst und dem Remoteordner entsprechend gesichert werden. Damit der Benutzer die Metadatendatei löschen kann, sollte der Anbieter, der die Metadatendatei erstellt, sie an einem Ort speichern, auf den der Benutzer zugreifen kann. Wenn der Anbieter, der die Metadatendatei erstellt, deinstalliert wird, muss er die Metadatendatei löschen. |
Sicherheit Hinweis |
---|
Wenn Sync Framework die Metadatendatei über einen Remotemechanismus öffnet, z. B. einen UNC-Pfad, kann nicht gleichzeitig von einer anderen Anwendung auf einem Computer auf die Metadatendatei zugegriffen werden, auch nicht von einer Anwendung auf dem Computer, auf dem die Metadatendatei gespeichert ist. |
Replikatmetadaten
Replikatmetadaten müssen vor der Verwendung initialisiert werden. Replikatmetadaten können für jeden Metadatenspeicher nur einmal initialisiert werden. Wenn benutzerdefinierte Felder oder Indizes erforderlich sind, müssen diese beim Initialisieren der Replikatmetadaten definiert werden.
Verwalteter Code Initialisieren Sie Replikatmetadaten, indem Sie InitializeReplicaMetadata aufrufen.
Nicht verwalteter Code Initialisieren Sie Replikatmetadaten, indem Sie ISyncMetadataStore::InitializeReplicaMetadata aufrufen.
Um auf Replikatmetadaten in einem vorhandenen Speicher zuzugreifen, muss ein Replikatmetadaten-Objekt abgerufen werden. Für jede Replikat-ID gibt es ein anderes Replikatmetadaten-Objekt. Beachten Sie jedoch, dass der Metadaten-Speicherdienst vor gleichzeitigen Aktualisierungen des Metadatenspeichers schützt, indem er zur selben Zeit nur ein Replikatmetadaten-Objekt für jede Replikat-ID zulässt. Wenn bereits ein Replikatmetadaten-Objekt für eine angegebene Replikat-ID vorhanden ist, wird während des Versuchs, das Objekt zu öffnen, ein Verweis auf das vorhandene Objekt zurückgegeben. Wenn in einem anderen Prozess als dem, in dem versucht wird, das Objekt zu öffnen, bereits eine Instanz des Replikatmetadaten-Objekts für eine angegebene Replikat-ID vorhanden ist, schlägt der Versuch fehl.
Verwalteter Code Rufen Sie ein Replikatmetadaten-Objekt ab, indem Sie GetReplicaMetadata aufrufen.
Nicht verwalteter Code Rufen Sie ein Replikatmetadaten-Objekt ab, indem Sie ISyncMetadataStore::GetReplicaMetadata aufrufen.
Das Replikatmetadaten-Objekt stellt Methoden für den Zugriff auf die Metadaten für ein Replikat und für die in einem Replikat enthaltenen Elemente bereit. Weitere Informationen finden Sie unter Zugreifen auf Replikatmetadaten.
Benutzerdefinierte Elementfelder
Für Elementmetadaten kann ein Satz benutzerdefinierter Felder definiert werden. Jedes Feld besteht aus einem eindeutigen Zeichenfolgennamen und einem Wert. Mithilfe dieser Felder können zusätzliche Metadaten zu einem Element gespeichert werden, das andernfalls nicht vom Standardsatz der Elementmetadaten unterstützt wird. Auf die Felder kann über zahlreiche Methoden von ItemMetadata (bei verwaltetem Code) oder IItemMetadata (bei nicht verwaltetem Code) zugegriffen werden. Diese Felder und ihr Format, einschließlich Größe und Datentyp, werden definiert, wenn die Replikatmetadaten initialisiert werden.
Verwalteter Code Geben Sie benutzerdefinierte Felder an, indem Sie ein FieldSchema-Objekt an InitializeReplicaMetadata übergeben.
Nicht verwalteter Code Geben Sie benutzerdefinierte Felder an, indem Sie ein Array von CUSTOM_FIELD_DEFINITION-Objekten an ISyncMetadataStore::InitializeReplicaMetadata übergeben.
Indexschemas
Ein Satz von Indexschemas kann definiert werden, um Sätze benutzerdefinierter Felder als Indizes zum effizienten Suchen von Elementen im Metadatenspeicher zu verwenden. Ein Indexschema kann als eindeutig definiert werden, um sicherzustellen, dass der Index ein einzelnes Element definiert. Jedes in einem Indexschema enthaltene Feld muss auch im benutzerdefinierten Feldschema vorhanden sein, das für das Replikat definiert ist.
Verwalteter Code Geben Sie Indexschemas an, indem Sie ein IndexSchema-Objekt an InitializeReplicaMetadata übergeben.
Nicht verwalteter Code Geben Sie Indexschemas an, indem Sie ein Array von CUSTOM_FIELDS_INDEX-Objekten an ISyncMetadataStore::InitializeReplicaMetadata übergeben.
Transaktionen
Transaktionen sind entweder implizite oder explizite Transaktionen. Implizite Transaktionen werden nur zum Lesen von Daten aus dem Metadatenspeicher unterstützt. Bei dem Versuch, in den Metadatenspeicher zu schreiben, ohne zuerst eine explizite Transaktion zu starten, wird eine ExplicitTransactionRequiredException (bei verwaltetem Code) ausgelöst oder SYNC_E_METADATA_ACTIVE_TRANSACTION_REQUIRED (bei nicht verwaltetem Code) zurückgegeben.
So legen Sie Metadaten mit verwaltetem Code fest
Starten Sie eine explizite Transaktion, indem Sie BeginTransaction aufrufen. Führen Sie einen Commit für während der Transaktion vorgenommene Änderungen aus, indem Sie CommitTransaction aufrufen. Verwerfen Sie während der Transaktion vorgenommene Änderungen, indem Sie RollbackTransaction aufrufen.
Legen Sie Eigenschaften für ein ReplicaMetadata-Objekt oder ein ItemMetadata-Objekt fest.
Speichern Sie die Eigenschaften mithilfe von SaveReplicaMetadata oder SaveItemMetadata.
So legen Sie Metadaten mit nicht verwaltetem Code fest
Starten Sie eine explizite Transaktion, indem Sie ISyncMetadataStore::BeginTransaction aufrufen. Führen Sie einen Commit für während der Transaktion vorgenommene Änderungen aus, indem Sie ISyncMetadataStore::CommitTransaction aufrufen. Verwerfen Sie während der Transaktion vorgenommene Änderungen, indem Sie ISyncMetadataStore::RollbackTransaction aufrufen.
Legen Sie Eigenschaften für ein IReplicaMetadata-Objekt oder ein IItemMetadata-Objekt fest.
Speichern Sie die Eigenschaften mithilfe von IReplicaMetadata::SaveReplicaMetadata oder IReplicaMetadata::SaveItemMetadata.
Hinweis
Dieser Transaktionsdienst gilt nur für die Metadaten, die im Metadatenspeicher gespeichert sind. Elementdaten, die im Elementspeicher für das Replikat gespeichert sind, werden nicht in diese Transaktion eingeschlossen.
Siehe auch
Verweis
ISqlSyncMetadataStore-Schnittstelle
CUSTOM_FIELD_DEFINITION-Struktur
IReplicaMetadata-Schnittstelle
IItemMetadata-Schnittstelle
CUSTOM_FIELDS_INDEX-Struktur
SqlMetadataStore
FieldSchema
ReplicaMetadata
ItemMetadata
IndexSchema