Freigeben über


Verwalten von Metadaten für einfache Anbieter

Ein einfacher Anbieter erfordert, dass Metadaten in Metadaten-Speicherdiensten gespeichert werden, die in SqlMetadataStore (für verwalteten Code) und ISqlSyncMetadataStore (für nicht verwalteten Code) implementiert werden.

Der Metadatenspeicher enthält folgende Metadatentypen, mit denen ein Anbieter oder eine Anwendung interagiert:

  • Eine Replikat-ID. Hierdurch wird das Replikat identifiziert, das einen bestimmten Speicher verwendet.

  • Element-IDs und Versionen. Diese identifizieren jedes im Elementspeicher aufgelistete Element und die aktuelle Version des Elements.

  • Änderungseinheit-IDs und Versionen. Diese identifizieren optional nachzuverfolgende Teile eines Elements und die aktuelle Version jedes Teils. Der Kontakt in einer Kontaktdatenbank könnte z. B. ein Element sein, und das Telefonnummernfeld könnte eine der Änderungseinheiten sein.

Identifizieren von Elementen im Elementspeicher und Metadatenspeicher

Damit ein Element synchronisiert werden kann, muss Sync Framework in der Lage sein, das Element im Elementspeicher zu identifizieren und diese Identität einer internen ID im Metadatenspeicher zuzuordnen. Außerdem muss ermittelt werden können, ob die Elementversion seit der letzten Synchronisierungssitzung geändert wurde. Wenn die Version geändert wurde und das Zielreplikat diese Version eines Elements nicht bereits enthält, sollte das Element synchronisiert werden. Wenn Änderungen auf der Ebene einer Änderungseinheit anstelle eines Elements synchronisiert werden, muss Sync Framework in der Lage sein, die Änderungseinheit und die zugehörige Version zu identifizieren. Eine Änderungseinheit entspricht einer Änderung eines Unterelements, wie zum Beispiel einem Feld für Telefonnummern in einem Element, das einen Kontakt darstellt. In diesem Beispiel werden keine Änderungseinheiten verwendet.

Festlegen des Formats von Metadatenspeicher-IDs

Im folgenden Codebeispiel werden der Konstruktor für MyFullEnumerationSimpleSyncProvider und die IdFormats-Eigenschaft definiert. Dadurch kann die Sync Framework-Laufzeit ermitteln, welches Format der Metadatenspeicher für IDs verwendet. Wenn keine flexiblen IDs verwendet werden, verwendet Sync Framework zur Identifizierung von Replikaten, Elementen und Änderungseinheiten ein festes Format. Bei der Verwendung flexibler IDs werden diese mithilfe von ISimpleSyncProviderIdGenerator-Methoden generiert.

public MyFullEnumerationSimpleSyncProvider(string name, MySimpleDataStore store)
{
    _name = name;
    _store = store;

    // Create a file to store metadata for all items and a file to store 
    // the replica ID.
    _replicaMetadataFile = Environment.CurrentDirectory + "\\" + _name.ToString() + ".Metadata";
    _replicaIdFile = Environment.CurrentDirectory + "\\" + _name.ToString() + ".Replicaid";

    // Set ReplicaIdFormat to use a GUID as an ID, and ItemIdFormat to use a GUID plus
    // an 8-byte prefix.
    _idFormats = new SyncIdFormatGroup();
    _idFormats.ItemIdFormat.IsVariableLength = false;
    _idFormats.ItemIdFormat.Length = 24;
    _idFormats.ReplicaIdFormat.IsVariableLength = false;
    _idFormats.ReplicaIdFormat.Length = 16;

    this.ItemConstraint += new EventHandler<SimpleSyncItemConstraintEventArgs>(OnItemConstraint);
    this.ItemConflicting += new EventHandler<SimpleSyncItemConflictingEventArgs>(OnItemConflicting);
}
public SyncId ReplicaId
{
    get 
    {
        if (_replicaId == null)
        {
            _replicaId = GetReplicaIdFromFile( _replicaIdFile);
        }

        return _replicaId; 
    }
}

public override SyncIdFormatGroup IdFormats
{
    get { return _idFormats; }
}
Public Sub New(ByVal name As String, ByVal store As MySimpleDataStore)
    _name = name
    _store = store

    ' Create a file to store metadata for all items and a file to store 
    ' the replica ID. 
    _replicaMetadataFile = (Environment.CurrentDirectory & "\") + _name.ToString() & ".Metadata"
    _replicaIdFile = (Environment.CurrentDirectory & "\") + _name.ToString() & ".Replicaid"

    ' Set ReplicaIdFormat to use a GUID as an ID, and ItemIdFormat to use a GUID plus 
    ' an 8-byte prefix. 
    _idFormats = New SyncIdFormatGroup()
    _idFormats.ItemIdFormat.IsVariableLength = False
    _idFormats.ItemIdFormat.Length = 24
    _idFormats.ReplicaIdFormat.IsVariableLength = False
    _idFormats.ReplicaIdFormat.Length = 16

    AddHandler Me.ItemConstraint, AddressOf HandleItemConstraint
    AddHandler Me.ItemConflicting, AddressOf HandleItemConflicting
End Sub
Public ReadOnly Property ReplicaId() As SyncId
    Get
        If _replicaId Is Nothing Then
            _replicaId = GetReplicaIdFromFile(_replicaIdFile)
        End If

        Return _replicaId
    End Get
End Property

Public Overrides ReadOnly Property IdFormats() As SyncIdFormatGroup
    Get
        Return _idFormats
    End Get
End Property

Festlegen von Elementfeldern und Metadatenschema

Sync Framework ordnet Elementspeicherdaten, oder zusätzliche von Ihnen erstellte Metadaten, internen Metadatenspeicher-IDs und Versionen zu. Dazu wird ein ItemMetadataSchema-Objekt verwendet, das von der MetadataSchema-Eigenschaft bereitgestellt wird. In den folgenden Codebeispielen wird die Eingabe für das ItemMetadataSchema-Objekt bereitgestellt. Die Konstanten im Beispielcode definieren für jede Spalte im Elementspeicher einen ganzzahligen Wert. Diese Werte werden beim Erstellen der benutzerdefinierten Felddefinitionen und Identitätsregeln für das ItemMetadataSchema-Objekt verwendet.

public const uint CUSTOM_FIELD_ID = 1;
public const uint CUSTOM_FIELD_TIMESTAMP = 2;
public override ItemMetadataSchema MetadataSchema
{
    get
    {
        CustomFieldDefinition[] customFields = new CustomFieldDefinition[2];
        customFields[0] = new CustomFieldDefinition(CUSTOM_FIELD_ID, typeof(ulong));
        customFields[1] = new CustomFieldDefinition(CUSTOM_FIELD_TIMESTAMP, typeof(ulong));

        IdentityRule[] identityRule = new IdentityRule[1];
        identityRule[0] = new IdentityRule(new uint[] { CUSTOM_FIELD_ID });

        return new ItemMetadataSchema(customFields, identityRule);
    }
}
Public Const CUSTOM_FIELD_ID As UInteger = 1
Public Const CUSTOM_FIELD_TIMESTAMP As UInteger = 2
Public Overrides ReadOnly Property MetadataSchema() As ItemMetadataSchema
    Get
        Dim customFields As CustomFieldDefinition() = New CustomFieldDefinition(1) {}
        customFields(0) = New CustomFieldDefinition(CUSTOM_FIELD_ID, GetType(ULong))
        customFields(1) = New CustomFieldDefinition(CUSTOM_FIELD_TIMESTAMP, GetType(ULong))

        Dim identityRule As IdentityRule() = New IdentityRule(0) {}
        identityRule(0) = New IdentityRule(New UInteger() {CUSTOM_FIELD_ID})

        Return New ItemMetadataSchema(customFields, identityRule)
    End Get
End Property

Vom ItemMetadataSchema-Objekt werden drei Eigenschaften bereitgestellt:

  • CustomFields

    Benutzerdefinierte Felder sind Felder im Metadatenspeicher, die durch ganze Zahlen identifiziert werden. Wenn eine Anwendung einen Anzeigenamen für ein oder mehrere Felder erfordert, sollte die ganze Zahl einem Namen zugeordnet werden. Benutzerdefinierte Felder werden aus zwei Gründen definiert: um Elemente zu identifizieren und um Versionsinformationen zu diesen Elementen bereitzustellen. Anhand von Versionsfeldern kann Sync Framework bestimmen, ob ein Element oder eine Änderungseinheit geändert wurde. In diesem Beispiel enthalten die Versionsfelder die tatsächlichen Daten aus dem Elementspeicher. Somit gibt es ein Feld für jedes Feld im Elementspeicher. Diese 1:1-Entsprechung ist weder erforderlich noch effizient. Eine praktischere Lösung wäre, einen Hash der Elementfelder in einem einzigen benutzerdefinierten Feld zu speichern.

  • IdentityRules

    Die Identitätsregel gibt an, welche benutzerdefinierten Felder zur Identifizierung eines Elements verwendet werden sollen. In diesem Fall wird das CUSTOM_FIELD_ID-Feld (Feld 0) verwendet.

  • ChangeUnitVersionDefinitions (wird in diesem Beispiel nicht verwendet)

    Wenn Änderungseinheiten verwendet werden, müssen Versionsfelder für die Änderungseinheiten definiert werden. Es besteht keine Anforderung für eine 1:1-Zuordnung zwischen Änderungseinheiten und Versionsinformationen oder dafür, dass die tatsächlichen Daten gespeichert werden. Änderungseinheiten können auch mehrere Felder umfassen. Diese Anwendung könnte z. B. angeben, dass Zip und Phone eine Änderungseinheit sind und dass Guid eine andere Änderungseinheit ist. Für Guid könnten Sie die tatsächlichen Daten verwenden und für die andere Änderungseinheit einen Hash der Felder Zip und Phone oder einen anderen Mechanismus zum Bestimmen der Version.

Einige der Methoden, die mit Elementspeicherdaten arbeiten, wie z. B. InsertItem, erfordern eine Auflistung von ItemField-Objekten, die die einzelnen Felder darstellen. Die ItemFieldDictionary-Objekte, die Parameter für diese Methoden sind, verfügen über die gleichen Indexwerte wie die CustomFieldDefinition-Objekte.

Siehe auch

Konzepte

Implementieren eines benutzerdefinierten einfachen Anbieters
Vorgehensweise: Erstellen eines verwalteten einfachen Anbieters