Поделиться через


Обновление версии хранилища метаданных

Службы хранилища метаданных сохраняют метаданные реплик и элементов в упрощенной базе данных. Метаданные сохраняются в конкретной схеме таблицы и в двоичном формате, которые могут измениться в следующих выпусках платформы Sync Framework. Помимо этого, поля пользовательского поставщика в базе данных могут изменяться по мере того, как разработчики выпускают новые версии конкретного поставщика. Платформы Sync Framework поддерживают обновление хранилища метаданных — вызванное как изменением версии служб Sync Framework, так и изменением версии поставщика.

Платформы Sync Framework также предоставляют поддержку доступа к хранилищу метаданных из компонентов других версий без обновления самого хранилища метаданных. Дополнительные сведения см. в разделе Доступ к метаданным из компонентов с различными версиями.

Обновление, вызванное изменением версии служб Sync Framework

Схема хранилища метаданных и формат файлов служб Sync Framework 2.0 отличаются от имеющихся в версии платформ Sync Framework 1.0. Файл хранилища метаданных можно хранить в формате 1.0 или, для более высокой эффективности, обновить файл до формата 2.0.

NoteПримечание.

После обновления файла хранилища метаданных его уже нельзя будет вернуть к предыдущей версии. Файл в формате 2.0 не может быть преобразован обратно в формат 1.0.

Если файл хранения метаданных в формате 1.0 открыть в Sync Framework 2.0, то он будет автоматически обновлен до формата версии 2.0, если поставщик не получает уведомления об обновлении и не указывает, что служба хранилища метаданных не должна обновлять формат файла. Чтобы задать необходимость обновления или, наоборот, запретить его, выполните следующие шаги.

  1. До открытия файла хранилища метаданных зарегистрируйтесь для получения события MetadataStoreUpgradeStart (для управляемого кода) или зарегистрируйте объект IMetadataStoreUpgradeCallback (для неуправляемого кода). Для регистрации объекта IMetadataStoreUpgradeCallback вызовите метод ISyncMetadataStore2::SetMetadataStoreUpgradeNotificationCallback.

  2. Откройте файл хранилища метаданных с помощью метода OpenStore (для управляемого кода) или ISqlSyncMetadataStore::OpenStore (для неуправляемого кода).

  3. Службы Sync Framework определят, что необходимо обновление, и вызовут обработчик события MetadataStoreUpgradeStart (для управляемого кода) или метод IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart (для неуправляемого кода).

  4. Поставщик указывает, следует ли обновить файл хранилища метаданных, используя свойство SkipUpgrade объекта UpgradeStartEventArgs (для управляемого кода) или параметр pfSkipUpgrade метода IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart (для неуправляемого кода).

Обновление, вызванное изменением версии поставщика

Поставщик задает версию поставщика, совместимую с метаданными, используя свойство ProviderVersion (для управляемого кода) или метод IReplicaMetadata2::SetProviderVersion (для неуправляемого кода). Когда поставщик открывает хранилище метаданных, он может проверить версию поставщика, связанную с метаданными конкретной реплики, используя свойство ProviderVersion (для управляемого кода) или метод IReplicaMetadata2::GetProviderVersion (для неуправляемого кода). Если версия поставщика, открывшего хранилище службы, отлична от версии поставщика, хранящейся в метаданных, поставщик может обновить схему метаданных этой реплики. Для обновления схемы метаданных выполните следующие шаги.

  1. Чтобы начать транзакцию, вызывается метод BeginTransaction (для управляемого кода) либо ISyncMetadataStore::BeginTransaction (для неуправляемого кода).

  2. Для сериализации метаданных реплики в каноническом формате используется класс SyncMetadataStoreSerializer (для управляемого кода) или ISyncMetadataStoreSerializer::SerializeReplicaMetadata (для неуправляемого кода).

  3. Удалите метаданные этой реплики из хранилища метаданных с помощью метода RemoveReplicaMetadata (для управляемого кода) или ISyncMetadataStore2::RemoveReplicaMetadata (для неуправляемого кода).

  4. Инициализируйте новые метаданные для этой реплики в хранилище метаданных с помощью метода InitializeReplicaMetadata (для управляемого кода) или ISyncMetadataStore::InitializeReplicaMetadata (для неуправляемого кода). В этом вызове задайте пользовательские столбцы и индексы из обновленной схемы метаданных.

  5. Импортируйте метаданные, сериализованные на шаге 1, с помощью метода DeserializeReplicaMetadata (для управляемого кода) или ISyncMetadataStoreSerializer::DeserializeReplicaMetadata (для неуправляемого кода). В этом вызове задайте версию обновленного поставщика и передайте объект IProviderUpgradeCallback (для управляемого кода) или IProviderMetadataUpgradeCallback (для неуправляемого кода). Этот объект будет получать сообщения о событиях, происходящих во время обновления.

  6. Во время обновления вызывается метод OnCustomReplicaMetadataDeserialized (для управляемого кода) или IProviderMetadataUpgradeCallback::OnReplicaCustomFieldDeserialized (для неуправляемого кода), чтобы дать возможность поставщику провести необходимые изменения пользовательских полей метаданных реплики.

  7. Во время обновления метод OnItemMetadataDeserialized (для управляемого кода) или IProviderMetadataUpgradeCallback::OnItemMetadataDeserialized (для неуправляемого кода) вызывается по одному разу для каждого десериализуемого элемента, чтобы дать возможность поставщику провести необходимые изменения пользовательских полей метаданных элемента.

  8. Задайте обновление новой версии поставщика в метаданных реплики с помощью метода ProviderVersion (для управляемого кода) или IReplicaMetadata2::SetProviderVersion (для неуправляемого кода).

  9. Чтобы зафиксировать транзакцию, вызывается метод CommitTransaction (для управляемого кода) либо ISyncMetadataStore::CommitTransaction (для неуправляемого кода).

Проблемы совместимости метаданных

При выпуске новой версии поставщика следует учитывать ряд соображений, относящихся к совместимости метаданных.

  • Форматы идентификаторов реплик, элементов и т. п., заданных в объекте SyncIdFormatGroup (для управляемого кода) или Структура ID_PARAMETERS (для неуправляемого кода), должны совпадать по всем экземплярам и версиям поставщика в данном сообществе синхронизации. Это общее правило, но оно повторяется здесь для полноты информации.

  • Пользовательское поле реплики не может изменяться несовместимым образом. Это поле представляет собой большой двоичный объект, который сериализуется и десериализуется без вмешательства платформ Sync Framework. Не следует вносить в структуру поля изменения, которые помешают более ранним версиям поставщика читать поле или писать в него.

  • Пользовательский столбец и схема индексов поставщика может изменяться от версии к версии поставщика. Эти схемы по желанию могут задаваться в методе InitializeReplicaMetadata (для управляемого кода) или ISyncMetadataStore::InitializeReplicaMetadata (для неуправляемого кода). При этом нужно учитывать следующее.

    • Поставщик не может вносить несовместимые изменения в схему метаданных. Например, нельзя удалять пользовательское поле, которое предыдущий поставщик требует обновлять при каждом обновлении элемента.

      Новая версия поставщика может добавлять пользовательские столбцы только в том случае, если обновление этих столбцов является необязательным. Предыдущие версии поставщика не знают о существовании этих столбцов.

    • Имена и значения пользовательских столбцов сериализуются, а типы данных этих столбцов, индексы и другая информация схемы — нет. Это означает, что пользовательские столбцы и индексы должны существовать в хранилище метаданных до того, как метаданные будут импортированы из канонического файла.

В новой версии поставщика нельзя изменять типы данных столбцов. Это может привести к ошибкам десериализации при работе предыдущих версий поставщика.

См. также

Другие ресурсы

Служба хранилища метаданных платформы Sync Framework