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 em um formato binário que podem sofrer alterações à medida que novas versões do Sync Framework são liberadas. 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 repositório de metadados porque as versões do Sync Framework e do provedor mudam.
O Sync Framework também dá suporte ao acesso do repositório de metadados de componentes com versões diferentes, sem atualizar o próprio repositório 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 repositório de metadados e o formato do arquivo do Sync Framework 2.1 e 2.0 são diferentes do Sync Framework 1.0. O arquivo de repositório de metadados pode ser mantido no formato 1.0 ou, para aumentar a eficiência, ele pode ser atualizado para o novo formato.
Dica
A atualização do arquivo de repositório de metadados não pode ser desfeita. Não é possível fazer downgrade de um arquivo no novo formato para o formato 1.0.
Quando um arquivo de repositório de metadados no formato 1.0 é aberto pelo Sync Framework 2.1 ou 2.0, ele é atualizado automaticamente para o novo formato, a menos que o provedor se registre para ser notificado sobre a 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.
Antes de abrir o arquivo de repositório 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.
Abra o arquivo de repositório de metadados usando OpenStore (para código gerenciado) ou ISqlSyncMetadataStore::OpenStore (para código não gerenciado).
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).
O provedor indica se o arquivo de repositório 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 repositório 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 repositório 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.
Inicie uma transação chamando BeginTransaction (para código gerenciado) ou ISyncMetadataStore::BeginTransaction (para código não gerenciado).
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).
Remova os metadados da réplica do repositório de metadados usando RemoveReplicaMetadata (para código gerenciado) ou ISyncMetadataStore2::RemoveReplicaMetadata (para código não gerenciado).
Inicialize novos metadados da réplica no repositório 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.
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.
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.
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.
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).
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 repositório 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.