Share via


管理資料並行

WCF RIA Services 支援開放式並行存取以確保資料一致性,而且依靠開發人員提供邏輯以處理更新資料來源時可能會發生的潛在衝突。當使用者可以更新或刪除資料時,您必須在盲目更新資料記錄中的值或從記錄刪除值之前,先確保沒有其他處理序已經變更資料來源中的資料。如果不檢查這些值是否已改變,則可能會不小心覆寫其他處理序設定的值,導致資料不一致。開放式並行存取假設這種衝突很罕見,但會將取自資料來源的值 (稍後可能會變更或刪除) 與來源中目前的值比較。如果不符,則會擲回必須處理的 OptimisticConcurrencyException

如需如何指定檢查值是否一致的程序,請參閱 HOW TO:啟用開放式並行存取檢查。如需如何使用明確交易確保一致性的詳細資訊,請參閱 HOW TO:將明確交易加入至網域服務

使用並行屬性

根據預設,RIA Services 不會將整個原始實體連同變更的值傳遞給資料存取層來檢查資料的並行。相反地,RIA Services 只會儲存並傳回那些標記著 RoundtripOriginalAttribute 屬性、ConcurrencyCheckAttribute 屬性或 TimestampAttribute 屬性的成員。

使用 Entity Framework 時,每個這些屬性 (Attribute) 可以套用至中繼資料類別中的屬性 (Property),或中繼資料類別本身。使用 POCO 定義資料模型時,它們也可以直接套用至 CLR 型別的屬性或類別。如需詳細資訊,請參閱 HOW TO:加入中繼資料類別。在套用這些屬性然後建置時,會導致個別的屬性出現在為屬性或類別產生之用戶端程式碼中。當屬性 (Attribute) 套用至類別,而不是類別中的屬性 (Property) 時,這相當於將屬性 (Attribute) 套用至該類別的所有成員。ConcurrencyCheckAttributeTimestampAttribute 屬性 (Attribute) 也會造成 RoundtripOriginalAttribute 出現在網域服務中繼資料中已套用到的用戶端屬性 (Property) 或類別。這個實作可讓您最佳化應用程式的效能,其方式是只指定您希望參與並行存取檢查的成員。如需詳細資訊,請參閱

Important 注意:
如果 KeyAttribute 套用至實體型別屬性,在建置專案時也會將 RoundtripOriginalAttribute 加入至用戶端上產生的對應屬性。因此,在使用 [加入新的 DomainService 類別] 精靈,從資料庫來源產生的網域服務中,這是做為實體索引鍵之屬性的預設行為。

當套用 RoundtripOriginalAttribute 時,資料存取層級會比較資料來源中的原始值 (在擷取資料時所記錄) 與資料來源中的目前值。如果值相同,表示存放區中的資料尚未變更,而且資料存取層會更新或刪除資料。如果資料已變更,表示發生衝突,而且會擲回 OptimisticConcurrencyException。衝突資訊會儲存在不再有目前資料之實體的 EntityConflict 屬性中。

如果將 ExcludeAttribute 屬性套用至可從用戶端更新或刪除之實體的成員,該成員不可用於開放式並行存取檢查。排除成員時,並不會為該成員儲存正確的原始值,因此更新作業一律會失敗。如需詳細資訊,請參閱 HOW TO:加入中繼資料類別

處理 OptimisticConcurrencyException

當快取中加入了物件或重新整理物件之後,如果物件快取中的資料變更與資料來源中的變更衝突,整個交易會復原。當 OptimisticConcurrencyException 發生時,您應該處理它,其方式是指定是否應該藉由保留物件資料中的資料 (ClientWins) 或使用資料來源中的資料更新物件快取 (StoreWins),以解決衝突狀況。如需有關如何執行這項操作的指引,請參閱儲存變更及管理並行存取