共用方式為


 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

交易確認至存放區所做的變更視為群組。 群組的變更可以認可或回復,當做單一單位。

每當您的程式碼可修改、 新增,或刪除的存放區中的任何項目Visual StudioVisualization and Modeling SDK,它必須在交易內進行。 必須有使用中的執行個體交易發生變更時,與儲存區相關聯。 這適用於所有模型項目、 關聯性、 圖形、 圖表和其屬性。

交易的機制,可協助您避免不一致的狀態。 如果在交易期間發生錯誤,會回復所有變更。 只有在使用者執行復原命令,每個新的交易將會被視為單一步驟。 使用者無法復原部分最近的變更,除非您明確地將他們在個別交易中。

開啟交易

管理交易的最簡單的方法是使用using陳述式括住try...catch陳述式︰

Store store; ...  
try  
{  
  using (Transaction transaction =  
    store.TransactionManager.BeginTransaction("update model"))  
    // Outermost transaction must always have a name.  
  {  
    // Make several changes in Store:  
    Person p = new Person(store);  
    p.FamilyTreeModel = familyTree;  
    p.Name = "Edward VI";  
    // end of changes to Store  
  
    transaction.Commit(); // Don't forget this!  
  } // transaction disposed here  
}  
catch (Exception ex)  
{  
  // If an exception occurs, the Store will be   
  // rolled back to its previous state.  
}  

如果例外狀況會使最終Commit()發生變更時,會重設為先前的狀態存放區。 這可協助您確定錯誤不會在不一致的狀態讓模型。

您可以讓任意數目的一筆交易內的變更。 您可以開啟使用中交易內的新交易。 巢狀的交易必須認可或回復之前包含交易結束。 如需詳細資訊,請參閱範例TransactionDepth屬性。

若要進行永久變更,您應該Commit處置它之前的交易。 如果發生例外狀況未攔截到在交易內,所做的變更之前的狀態將會重設存放區。

復原交易

若要確保在儲存區會保留在或還原到之前交易狀態,您可以使用這些策略之一︰

  1. 引發交易的範圍內沒有攔截到例外狀況。

  2. 明確回復交易︰

    this.Store.TransactionManager.CurrentTransaction.Rollback();  
    

交易不會影響非存放區物件

交易只能用於管理存放區的狀態。 它們無法復原至外部的項目,例如檔案、 資料庫或您已經具有一般類型的 DSL 定義之外宣告的物件所做的部分變更。

如果例外狀況可能會導致這類變更與儲存區不一致,您應該處理這個例外狀況處理常式中的可能性。 若要確保外部資源保持同步的儲存區物件的一個方法是在存放區項目結合每個外部物件,使用事件處理常式。 如需詳細資訊,請參閱事件處理常式傳播變更外部模型

規則引發交易的結尾

在交易結束時,交易已處置之前,不會引發的規則附加到存放區中的項目。 每個規則會套用至模型項目已變更的方法。 比方說,有其模型項目已變更時,更新狀態的圖形的 「 修正 」 規則,並建立模型項目時,這會建立圖形。 沒有任何指定的引發順序。 規則所做的變更可以引發另一個規則。

您可以定義自己的規則。 如需規則的詳細資訊,請參閱回應及傳播變更

規則不會復原、 重做或復原命令之後引發。

交易內容

每一筆交易具有的字典,您可以在其中儲存任何您想要的資訊︰

store.TransactionManager

.CurrentTransaction.TopLevelTransaction

.Context.Add(aKey, aValue);

這是特別適用於規則之間傳輸資訊。

交易狀態

如果變更因復原或取消復原交易,在某些情況下,您必須避免傳播變更。 這種情形,例如,如果您要撰寫可以更新存放區中的另一個值的屬性值處理常式。 復原作業會將存放區中的所有值重都設成其先前狀態,因為它不需要計算更新的值。 使用此程式碼︰

if (!this.Store.InUndoRedoOrRollback) {...}  

一開始從檔案載入存放區時,可以引發規則。 若要避免回應這些變更,請使用︰

if (!this.Store.InSerializationTransaction) {...}