Partilhar via


Atualizando a versão do repositório de metadados

O serviço de armazenamento de metadados armazena metadados de réplica e de item em um banco de dados leve. Os metadados são armazenados em um esquema de tabela específico e formato binário que podem sofrer alterações à medida que novas versões do Sync Framework são lançadas. Além disso, campos de provedores personalizados no banco de dados podem ser alterados conforme um desenvolvedor lança novas versões de um provedor específico. O Sync Framework dá suporte à atualização do armazenamento de metadados porque as versões do Sync Framework e do provedor mudam.

O Sync Framework também dá suporte ao acesso do armazenamento de metadados de componentes com versões diferentes, sem atualizar o próprio armazenamento de metadados. Para obter mais informações, consulte Acessando metadados em componentes com versões diferentes.

Atualizando devido à alteração da versão do Sync Framework

O esquema de armazenamento de metadados e o formato do arquivo são diferentes no Sync Framework 2.0 e no Sync Framework 1.0. O arquivo de armazenamento de metadados pode ser mantido no formato 1.0 ou, para obter mais eficiência, o arquivo pode ser atualizado para o formato 2.0.

Dica

A atualização do arquivo de armazenamento de metadados não pode ser desfeita. Não é possível fazer downgrade de um arquivo no formato 2.0 para o formato 1.0.

Quando um arquivo de armazenamento de metadados no formato 1.0 é pelo Sync Framework 2.0, ele é atualizado automaticamente para o formato 2.0, a menos que o provedor se registre para ser notificado da atualização e indique que o serviço de armazenamento de metadados não deve atualizar o formato do arquivo. Para controlar a ocorrência da atualização, execute as etapas a seguir.

  1. Antes de abrir o arquivo de armazenamento de metadados, registre o recebimento do evento MetadataStoreUpgradeStart (para código gerenciado) ou registre um objeto IMetadataStoreUpgradeCallback (para código não gerenciado). Para registrar o IMetadataStoreUpgradeCallback, chame ISyncMetadataStore2::SetMetadataStoreUpgradeNotificationCallback.

  2. Abra o arquivo de armazenamento de metadados usando OpenStore (para código gerenciado) ou ISqlSyncMetadataStore::OpenStore (para código não gerenciado).

  3. O Sync Framework detecta a necessidade de uma atualização e chama o manipulador de eventos MetadataStoreUpgradeStart (para código gerenciado) ou o método IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart (para código não gerenciado).

  4. O provedor indica se o arquivo de armazenamento de metadados deve ser atualizado usando a propriedade SkipUpgrade do objeto UpgradeStartEventArgs (para código gerenciado) ou o parâmetro pfSkipUpgrade do método IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart (para código não gerenciado).

Atualizando devido à alteração da versão do provedor

Um provedor define a versão de provedor compatível com os metadados de uma réplica usando ProviderVersion (para código gerenciado) ou IReplicaMetadata2::SetProviderVersion (para código não gerenciado). Quando um provedor abre um armazenamento de metadados, ele pode verificar a versão de provedor associada aos metadados de uma réplica usando ProviderVersion (para código gerenciado) ou IReplicaMetadata2::GetProviderVersion (para código não gerenciado). Quando a versão do provedor que abre o armazenamento de metadados é diferente da versão do provedor armazenada nos metadados, o provedor por atualizar o esquema de metadados da réplica. Para atualizar o esquema de metadados, execute as etapas a seguir.

  1. Inicie uma transação chamando BeginTransaction (para código gerenciado) ou ISyncMetadataStore::BeginTransaction (para código não gerenciado).

  2. Serialize os metadados da réplica para o formato canônico usando SyncMetadataStoreSerializer (para código gerenciado) ou ISyncMetadataStoreSerializer::SerializeReplicaMetadata (para código não gerenciado).

  3. Remova os metadados da réplica do armazenamento de metadados usando RemoveReplicaMetadata (para código gerenciado) ou ISyncMetadataStore2::RemoveReplicaMetadata (para código não gerenciado).

  4. Inicialize novos metadados da réplica no armazenamento de metadados usando InitializeReplicaMetadata(para código gerenciado) ou ISyncMetadataStore::InitializeReplicaMetadata (para código não gerenciado). Nessa chamada, especifique as colunas e os índices personalizados do esquema de metadados atualizado.

  5. Importe os metadados que foram serializados na etapa 1 usando DeserializeReplicaMetadata (para código gerenciado) ou ISyncMetadataStoreSerializer::DeserializeReplicaMetadata (para código não gerenciado). Especifique a versão do provedor atualizada nesta chamada e forneça um IProviderUpgradeCallback (para código gerenciado) ou um objeto IProviderMetadataUpgradeCallback (para código não gerenciado) que receberá a notificação de eventos ocorridos durante a atualização.

  6. Durante a atualização, OnCustomReplicaMetadataDeserialized (para código gerenciado) ou IProviderMetadataUpgradeCallback::OnReplicaCustomFieldDeserialized (para código não gerenciado) é chamado para permitir que o provedor altere o campo de metadados personalizados da réplica.

  7. Durante a atualização, OnItemMetadataDeserialized (para código gerenciado) ou IProviderMetadataUpgradeCallback::OnItemMetadataDeserialized (para código não gerenciado) é chamado uma vez para cada item desserializado, para permitir que o provedor altere os metadados de um item.

  8. Defina a versão do provedor atualizado nos metadados da réplica usando ProviderVersion (para código gerenciado) ou IReplicaMetadata2::SetProviderVersion (para código não gerenciado).

  9. Confirme a transação chamando CommitTransaction (para código gerenciado) ou ISyncMetadataStore::CommitTransaction (para código não gerenciado).

Considerações sobre compatibilidade de metadados

Ao lançar uma nova versão de um provedor, você deve estar ciente das seguintes considerações relacionadas à compatibilidade de metadados:

  • Os formatos de IDs de réplica, IDs de item etc. que são especificados em SyncIdFormatGroup (para código gerenciado) ou Estrutura ID_PARAMETERS (para código não gerenciado) devem ser os mesmos em todas as instâncias e versões de um provedor em uma comunidade de sincronização específica. Essa é uma regra geral, declarada novamente aqui para que seja observada.

  • O campo personalizado de uma réplica não pode ser alterado de modo incompatível. Esse campo é um BLOB que é serializado e desserializado sem intervenção do Sync Framework. Não altere a estrutura do campo de forma que impeça a leitura ou gravação no campo por uma versão anterior do provedor.

  • O esquema de índice e a coluna personalizada de um provedor podem ser alterados entre as versões do provedor. Esses esquemas são especificados como opção no método InitializeReplicaMetadata (para código gerenciado) ou no método ISyncMetadataStore::InitializeReplicaMetadata (para código não gerenciado). No entanto, esteja ciente do seguinte:

    • O provedor não pode fazer alterações incompatíveis no esquema de metadados. Por exemplo, não é possível remover um campo personalizado cuja atualização foi exigida por um provedor anterior para cada atualização de item.

      Uma nova versão de um provedor poderá adicionar colunas personalizadas somente se a atualização dessas colunas for opcional. A versão anterior do provedor não estará ciente da existência dessas colunas.

    • Os valores e nomes de colunas personalizados são serializados, mas os tipos de dados dessas colunas, índices e outras informações de esquema não são. Isso significa que os índices e as colunas personalizadas devem existir no armazenamento de metadados antes de importar metadados de um arquivo canônico.

Não é possível alterar os tipos de dados de coluna em uma versão mais nova de um provedor. Isso poderia resultar em erros de desserialização para versões anteriores de um provedor.

Consulte também

Outros recursos

Sync Framework Metadata Storage Service