メタデータ ストアのアップグレード
Metadata Storage Service では、簡易データベースにレプリカと項目メタデータを格納します。メタデータは特定のテーブル スキーマにバイナリ形式で格納されますが、この形式は、新しいバージョンの Sync Framework がリリースされると変更される場合があります。また、データベースのカスタム プロバイダー フィールドは、開発者が新しいバージョンのプロバイダーをリリースしたときに変更される場合があります。Sync Framework では、Sync Framework バージョンの変更とプロバイダー バージョンの変更のどちらにも対応できるように、メタデータ ストアのアップグレードをサポートしています。
さらに Sync Framework では、メタデータ ストア自体をアップグレードしなくても、さまざまなバージョンのコンポーネントからメタデータ ストアにアクセスできる機能がサポートされています。詳細については、「バージョンが異なるコンポーネントのメタデータへのアクセス」を参照してください。
Sync Framework のバージョン変更によるアップグレード
Sync Framework 2.0 では、メタデータ ストアのスキーマとファイル形式が Sync Framework 1.0 と異なっています。メタデータ ストア ファイルの形式は 1.0 形式のままにすることもできますが、効率を高めるために 2.0 形式にアップグレードすることもできます。
注意
メタデータ ストア ファイルをアップグレードした場合、元に戻すことはできません。2.0 形式のファイルは 1.0 形式にダウングレードすることはできません。
プロバイダーでアップグレードの通知の受け取りが登録されておらず、Metadata Storage Service によってファイル形式をアップグレードしないことが指定されていない限り、1.0 形式のメタデータ ストア ファイルを Sync Framework 2.0 で開いた場合、自動的に 2.0 形式にアップグレードされます。アップグレードの実行を制御するには、次の手順に従います。
メタデータ ストア ファイルを開く前に、MetadataStoreUpgradeStart イベント (マネージ コードの場合) を受け取るように登録するか、または IMetadataStoreUpgradeCallback オブジェクト (アンマネージ コードの場合) を登録します。IMetadataStoreUpgradeCallback を登録するには ISyncMetadataStore2::SetMetadataStoreUpgradeNotificationCallback を呼び出します。
OpenStore (マネージ コードの場合) または ISqlSyncMetadataStore::OpenStore (アンマネージ コードの場合) を使用して、メタデータ ストア ファイルを開きます。
Sync Framework によりアップグレードが必要なことが検出され、MetadataStoreUpgradeStart イベント ハンドラー (マネージ コードの場合) または IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart メソッド (アンマネージ コードの場合) が呼び出されます。
プロバイダーで、UpgradeStartEventArgs オブジェクトの SkipUpgrade プロパティ (マネージ コードの場合) または IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart メソッドの pfSkipUpgrade パラメーター (アンマネージ コードの場合) を使用して、メタデータ ストア ファイルをアップグレードする必要があるかどうかを示します。
プロバイダーのバージョン変更によるアップグレード
プロバイダーでは、ProviderVersion (マネージ コードの場合) または IReplicaMetadata2::SetProviderVersion (アンマネージ コードの場合) を使用して、レプリカのメタデータと互換性のあるプロバイダー バージョンをレプリカに設定します。プロバイダーがメタデータ ストアを開くとき、ProviderVersion (マネージ コードの場合) または IReplicaMetadata2::GetProviderVersion (アンマネージ コードの場合) を使用して、レプリカのメタデータに関連付けられているプロバイダーのバージョンを判別できます。メタデータ ストアを開くプロバイダーのバージョンと、メタデータ内に格納されているプロバイダー バージョンが異なる場合、プロバイダーではレプリカのメタデータ スキーマをアップグレードすることができます。メタデータ スキーマをアップグレードするには、次の手順に従います。
BeginTransaction (マネージ コードの場合) または ISyncMetadataStore::BeginTransaction (アンマネージ コードの場合) を呼び出して、トランザクションを開始します。
SyncMetadataStoreSerializer (マネージ コードの場合) または ISyncMetadataStoreSerializer::SerializeReplicaMetadata (アンマネージ コードの場合) を使用して、レプリカのメタデータを適切な形式にシリアル化します。
RemoveReplicaMetadata (マネージ コードの場合) または ISyncMetadataStore2::RemoveReplicaMetadata (アンマネージ コードの場合) を使用して、メタデータ ストアからレプリカのメタデータを削除します。
InitializeReplicaMetadata (マネージ コードの場合) または ISyncMetadataStore::InitializeReplicaMetadata (アンマネージ コードの場合) を使用して、メタデータ ストア内のレプリカの新しいメタデータを初期化します。この呼び出しでは、アップグレードするメタデータ スキーマのカスタム列とインデックスを指定します。
DeserializeReplicaMetadata (マネージ コードの場合) または ISyncMetadataStoreSerializer::DeserializeReplicaMetadata (アンマネージ コードの場合) を使用して、手順 1. でシリアル化したメタデータをインポートします。この呼び出しで、アップグレードするプロバイダーのバージョンを指定し、アップグレード時に発生するイベントの通知を受け取る IProviderUpgradeCallback オブジェクト (マネージ コードの場合) または IProviderMetadataUpgradeCallback オブジェクト (アンマネージ コードの場合) を指定します。
アップグレード中に、OnCustomReplicaMetadataDeserialized (マネージ コードの場合) または IProviderMetadataUpgradeCallback::OnReplicaCustomFieldDeserialized (アンマネージ コードの場合) が呼び出され、プロバイダーがレプリカのカスタム メタデータ フィールドに変更を加えることが許可されます。
アップグレード中に、シリアル化解除される各項目に対して 1 回ずつ OnItemMetadataDeserialized (マネージ コードの場合) または IProviderMetadataUpgradeCallback::OnItemMetadataDeserialized (アンマネージ コードの場合) が呼び出され、プロバイダーが項目のメタデータに変更を加えることが許可されます。
ProviderVersion (マネージ コードの場合) または IReplicaMetadata2::SetProviderVersion (アンマネージ コードの場合) を使用して、レプリカのメタデータ内にアップグレードされるプロバイダーのバージョンを設定します。
CommitTransaction (マネージ コードの場合) または ISyncMetadataStore::CommitTransaction (アンマネージ コードの場合) を呼び出して、トランザクションをコミットします。
メタデータの互換性の考慮事項
新しいバージョンのプロバイダーをリリースする際には、メタデータの互換性に関連する次の事項に注意してください。
レプリカ ID、項目 ID など (これは SyncIdFormatGroup (マネージ コードの場合) または ID_PARAMETERS 構造体 (アンマネージ コードの場合) で指定されます) は、特定の同期コミュニティ内で、プロバイダーのすべてのインスタンスおよびバージョンに対して同一である必要があります。これは一般的な規則ですが、ここでは念のために再度説明しました。
レプリカのカスタム フィールドは、互換性のない方法で変更することはできません。このフィールドは BLOB であり、Sync Framework の介入を受けずにシリアル化およびシリアル化解除されます。以前のバージョンのプロバイダーがフィールドを読み書きできなくなるような方法で、フィールドの構造を変更することはしないでください。
プロバイダーのカスタム列とインデックス スキーマは、プロバイダーのバージョンが変わると変更される場合があります。このスキーマは、必要に応じて InitializeReplicaMetadata メソッド (マネージ コードの場合) または ISyncMetadataStore::InitializeReplicaMetadata メソッド (アンマネージ コードの場合) で指定されます。ただし、次の点に注意してください。
プロバイダーでは、メタデータ スキーマに互換性のない変更を加えることができません。たとえば、項目が更新されるたびに更新される必要がある前のプロバイダーのカスタム フィールドは削除できません。
新しいバージョンのプロバイダーでは、カスタム列の更新が省略可能な場合にのみ、そのカスタム列を追加できます。前のバージョンのプロバイダーでは、そのような列の存在を認識できません。
カスタム列の名前と値はシリアル化されますが、その列のデータ型、インデックス、その他のスキーマ情報はシリアル化されません。つまり、適切なファイルからメタデータをインポートする前に、カスタム列およびインデックスがメタデータ ストアに存在している必要があります。
新しいバージョンのプロバイダーの列のデータ型は変更できません。このデータ型を変更した場合、前のバージョンのプロバイダーでシリアル化解除エラーが発生する可能性があります。