共用方式為


升級中繼資料存放區版本

中繼資料儲存服務會將複寫和項目中繼資料儲存在輕量型資料庫中。中繼資料是以特定的資料表結構描述和二進位格式儲存,而此格式可能會在發行新版 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 格式。

當 1.0 格式的中繼資料存放區檔案透過 Sync Framework 2.0 開啟時,除非提供者註冊接收升級通知,並指出中繼資料儲存服務不應升級檔案格式,否則會將該格式自動升級為 2.0 格式。若要控制是否升級,請執行下列步驟。

  1. 在開啟中繼資料存放區檔案之前,請註冊接收 MetadataStoreUpgradeStart 事件 (適用於 Managed 程式碼) 或註冊 IMetadataStoreUpgradeCallback 物件 (適用於 Unmanaged 程式碼)。若要註冊 IMetadataStoreUpgradeCallback,請呼叫 ISyncMetadataStore2::SetMetadataStoreUpgradeNotificationCallback

  2. 使用 OpenStore (適用於 Managed 程式碼) 或 ISqlSyncMetadataStore::OpenStore (適用於 Unmanaged 程式碼) 開啟中繼資料存放區檔案。

  3. Sync Framework 會偵測需要進行升級,並呼叫 MetadataStoreUpgradeStart 事件處理常式 (適用於 Managed 程式碼) 或 IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart 方法 (適用於 Unmanaged 程式碼)。

  4. 此提供者會指出是否應該升級中繼資料存放區檔案,其方式是使用 UpgradeStartEventArgs 物件 (適用於 Managed 程式碼) 的 SkipUpgrade 屬性,或是 IMetadataStoreUpgradeCallback::OnMetadataStoreFileUpgradeStart 方法 (適用於 Unmanaged 程式碼) 的 pfSkipUpgrade 參數。

因為提供者版本已經變更而升級

提供者會設定與複寫的中繼資料相容的提供者版本,其方式是使用 ProviderVersion (適用於 Managed 程式碼) 或 IReplicaMetadata2::SetProviderVersion (適用於 Unmanaged 程式碼)。當提供者開啟中繼資料存放區時,它可以檢查與複寫的中繼資料相關聯的提供者版本,其方式是使用 ProviderVersion (適用於 Managed 程式碼) 或 IReplicaMetadata2::GetProviderVersion (適用於 Unmanaged 程式碼)。當開啟中繼資料存放區的提供者版本與儲存於中繼資料的提供者版本不同時,此提供者可以升級複寫的中繼資料結構描述。若要升級中繼資料結構描述,請執行下列步驟。

  1. 藉由呼叫 BeginTransaction (適用於 Managed 程式碼) 或 ISyncMetadataStore::BeginTransaction (適用於 Unmanaged 程式碼) 來啟動交易。

  2. 將複寫的中繼資料序列化成標準格式,其方式是使用 SyncMetadataStoreSerializer (適用於 Managed 程式碼) 或 ISyncMetadataStoreSerializer::SerializeReplicaMetadata (適用於 Unmanaged 程式碼)。

  3. 從中繼資料存放區中移除複寫的中繼資料,其方式是使用 RemoveReplicaMetadata (適用於 Managed 程式碼) 或 ISyncMetadataStore2::RemoveReplicaMetadata (適用於 Unmanaged 程式碼)。

  4. 在中繼資料存放區中初始化複寫的新中繼資料,其方式是使用 InitializeReplicaMetadata (適用於 Managed 程式碼) 或 ISyncMetadataStore::InitializeReplicaMetadata (適用於 Unmanaged 程式碼)。在這個呼叫中,請從升級的中繼資料結構描述中指定自訂資料行和索引。

  5. 匯入步驟 1 所序列化的中繼資料,其方式是使用 DeserializeReplicaMetadata (適用於 Managed 程式碼) 或 ISyncMetadataStoreSerializer::DeserializeReplicaMetadata (適用於 Unmanaged 程式碼)。在這個呼叫中指定升級的提供者版本,並提供 IProviderUpgradeCallback (適用於 Managed 程式碼) 或 IProviderMetadataUpgradeCallback (適用於 Unmanaged 程式碼) 物件,此物件將會收到升級期間所發生之事件的通知。

  6. 在升級期間,將會呼叫 OnCustomReplicaMetadataDeserialized (適用於 Managed 程式碼) 或 IProviderMetadataUpgradeCallback::OnReplicaCustomFieldDeserialized (適用於 Unmanaged 程式碼),好讓提供者針對複寫的自訂中繼資料欄位進行任何變更。

  7. 在升級期間,將會針對還原序列化的每一個項目呼叫 OnItemMetadataDeserialized (適用於 Managed 程式碼) 或 IProviderMetadataUpgradeCallback::OnItemMetadataDeserialized (適用於 Unmanaged 程式碼) 一次,好讓提供者針對項目的中繼資料進行任何變更。

  8. 在複寫的中繼資料中設定升級的提供者版本,其方式是使用 ProviderVersion (適用於 Managed 程式碼) 或 IReplicaMetadata2::SetProviderVersion (適用於 Unmanaged 程式碼)。

  9. 藉由呼叫 CommitTransaction (適用於 Managed 程式碼) 或 ISyncMetadataStore::CommitTransaction (適用於 Unmanaged 程式碼) 來認可交易。

中繼資料相容性考量

當您發行了新版的提供者時,您應該注意下列與中繼資料相容性有關的考量:

  • 複寫識別碼、項目識別碼等項目的格式 (指定在 SyncIdFormatGroup (適用於 Managed 程式碼) 或 ID_PARAMETERS 結構適用於 Unmanaged 程式碼) 中) 在特定同步處理社群內的所有提供者執行個體和版本之間都必須相同。這是一般的規則,在這裡重述是為了完整性。

  • 複寫的自訂欄位不能使用不相容的方式來變更。這個欄位是序列化和還原序列化的 BLOB,而不需從 Sync Framework 介入。請勿使用讓舊版提供者無法讀取或寫入欄位的方式來變更欄位的結構。

  • 不同提供者版本之間可以變更提供者的自訂資料行和索引結構描述。這些結構描述會在 InitializeReplicaMetadata 方法 (適用於 Managed 程式碼) 或 ISyncMetadataStore::InitializeReplicaMetadata 方法 (適用於 Unmanaged 程式碼) 中選擇性地指定。但是,請注意以下事項:

    • 提供者無法針對中繼資料結構描述進行不相容的變更。例如,您無法移除舊版提供者在針對每一個項目更新進行更新時所需要的自訂欄位。

      新版本的提供者可以新增自訂資料行,唯一前提是更新這些資料行是選擇性的。舊版提供者將不會注意到這些資料行存在。

    • 自訂資料行名稱和值會序列化,但是這些資料行的資料類型、索引和其他結構描述資訊則不會序列化。這表示,從標準檔案匯入中繼資料之前,自訂資料行和索引必須已經存在於中繼資料存放區。

您無法使用較新版本的提供者來變更資料行的資料類型,這可能會導致舊版的提供者發生還原序列化錯誤。

請參閱

其他資源

Sync Framework Metadata Storage Service