Comment : utiliser des transactions pour mettre à jour le modèleHow to: Use Transactions to Update the Model

Les transactions vous assurer que les modifications qui ont été apportées dans le magasin sont traitées en tant que groupe.Transactions make sure that changes that were made to the store are treated as a group. Les modifications qui sont regroupées peuvent être validées ou restaurées en tant qu’unité unique.Changes that are grouped can be committed or rolled back as a single unit.

Chaque fois que votre code de programme modifie, ajoute ou supprime un élément dans le magasin Visual StudioVisual Studio Visualization and Modeling SDK, il doit le faire à l’intérieur d’une transaction.Whenever your program code modifies, adds, or deletes any element in the Store in Visual StudioVisual Studio Visualization and Modeling SDK, it must do so inside a transaction. Il doit y avoir une instance active de Transaction associé au magasin lorsque la modification se produit.There must be an active instance of Transaction associated with the Store when the change happens. Cela s’applique à tous les éléments de modèle, des relations, des formes, des diagrammes et leurs propriétés.This applies to all model elements, relationships, shapes, diagrams, and their properties.

Le mécanisme de transaction permet d’éviter des états instables.The transaction mechanism helps you avoid inconsistent states. Si une erreur se produit lors d’une transaction, toutes les modifications sont annulées.If an error occurs during a transaction, all the changes are rolled back. Si l’utilisateur exécute une commande d’annulation, chaque transaction récente est traitée comme une seule étape.If the user performs an Undo command, each recent transaction is treated as a single step. L’utilisateur ne peut pas annuler les parties d’une modification récente, sauf si vous les placez dans des transactions distinctes.The user cannot undo parts of a recent change, unless you explicitly put them in separate transactions.

Ouverture d’une transactionOpening a transaction

La méthode la plus commode de gérer une transaction est un using instruction entre dans un try...catch instruction :The most convenient method of managing a transaction is with a using statement enclosed in a try...catch statement:

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.
}

Si une exception qui empêche le dernier Commit() se produit pendant les modifications, le magasin sera réinitialisé à son état précédent.If an exception that prevents the final Commit() occurs during the changes, the Store will be reset to its previous state. Cela vous permet de vous assurer que les erreurs ne laissent pas le modèle dans un état incohérent.This helps you make sure that errors do not leave the model in an inconsistent state.

Vous pouvez effectuer n’importe quel nombre de modifications à l’intérieur d’une transaction.You can make any number of changes inside one transaction. Vous pouvez ouvrir les nouvelles transactions à l’intérieur d’une transaction active.You can open new transactions inside an active transaction. Les transactions imbriquées doivent valider ou annuler avant la fin de la transaction qui le contient.The nested transactions must commit or roll back before the containing transaction ends. Pour plus d’informations, consultez l’exemple de la TransactionDepth propriété.For more information, see the example for the TransactionDepth property.

Pour conserver vos modifications, vous devez Commit la transaction avant sa suppression.To make your changes permanent, you should Commit the transaction before it is disposed. Si une exception se produit qui n’est pas interceptée à l’intérieur de la transaction, le magasin réinitialisera à son état avant les modifications.If an exception occurs that is not caught inside the transaction, the Store will be reset to its state before the changes.

Restauration d'une transactionRolling back a transaction

Pour vous assurer que le magasin conserve ou retrouve son état avant la transaction, vous pouvez utiliser une de ces tactiques :To ensure that the Store remains in or reverts to its state before the transaction, you can use either of these tactics:

  1. Déclencher une exception qui n’est pas interceptée dans la portée de la transaction.Raise an exception that is not caught inside the scope of the transaction.

  2. Restaurer explicitement la transaction :Explicitly roll back the transaction:

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

Les transactions n’affectent pas les objets de magasin NonTransactions Do Not Affect Non-Store Objects

Transactions régissent uniquement l’état de la banque.Transactions only govern the state of the Store. Ils ne peuvent pas annuler les modifications partielles ont été apportées à des éléments externes tels que des fichiers, des bases de données ou des objets que vous avez déclarés avec des types ordinaires en dehors de la définition DSL.They cannot undo partial changes that have been made to external items such as files, databases, or objects that you have declared with ordinary types outside the DSL definition.

Si une exception peut ne pas une telle modification incompatible avec le magasin, vous devez répondre à cette éventualité dans le Gestionnaire d’exceptions.If an exception might leave such a change inconsistent with the Store, you should deal with that possibility in the exception handler. Une pour vous assurer que les ressources externes restent synchronisés avec les objets de magasin consiste à associer chaque objet externe à un élément dans le magasin à l’aide de gestionnaires d’événements.One way to make sure that external resources remain synchronized with the Store objects is to couple each external object to an in-store element by using event handlers. Pour plus d’informations, consultez gestionnaires propager les modifications en dehors du modèle d’événement.For more information, see Event Handlers Propagate Changes Outside the Model.

Feu de règles à la fin d’une TransactionRules Fire at the End of a Transaction

À la fin d’une transaction, avant la suppression de la transaction, les règles associées à des éléments dans le magasin sont déclenchés.At the end of a transaction, before the transaction is disposed, the rules attached to elements in the store are fired. Chaque règle est une méthode qui est appliquée à un élément de modèle qui a changé.Each rule is a method that is applied to a model element that has changed. Par exemple, il existe des règles « corriger » pour mettre à jour l’état d’une forme lorsque son élément de modèle a été modifiée, et qui créent une forme lors de la création d’un élément de modèle.For example, there are "fix up" rules that update the state of a Shape when its model element has changed, and which create a Shape when a model element is created. Il n’existe aucun ordre d’activation spécifié.There is no specified firing order. Une modification apportée par une règle peut se déclencher une autre règle.A change made by a rule can fire another rule.

Vous pouvez définir vos propres règles.You can define your own rules. Pour plus d’informations sur les règles, consultez réponse aux et propager les modifications.For more information about rules, see Responding to and Propagating Changes.

Les règles ne sont pas activent après une opération d’annulation, une restauration par progression ou une commande de restauration.Rules do not fire after an undo, a redo, or a rollback command.

Contexte de transactionTransaction Context

Chaque transaction a un dictionnaire dans lequel vous pouvez stocker les informations souhaitées :Each transaction has a dictionary in which you can store any information you want:

store.TransactionManager

.CurrentTransaction.TopLevelTransaction

.Context.Add(aKey, aValue);

Cela est particulièrement utile pour transférer des informations entre les règles.This is especially useful for transferring information between rules.

État de la transactionTransaction state

Dans certains cas, de que vous devez éviter propager une modification si la modification est dû à une annulation ou le rétablissement d’une transaction.In some cases you need to avoid propagating a change if the change is caused by undoing or redoing a transaction. Cela peut se produire, par exemple, si vous écrivez un gestionnaire de valeur de propriété qui peut mettre à jour une autre valeur dans le magasin.This can happen, for example, if you write a property value handler that can update another value in the Store. Étant donné que l’opération d’annulation réinitialise toutes les valeurs dans le magasin à leur état, il n’est pas nécessaire calculer les valeurs mises à jour.Because the undo operation resets all the values in the Store to their previous states, it is not necessary to compute updated values. Utilisez ce code :Use this code:

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

Règles peuvent se déclencher lorsque le magasin est initialement chargé à partir d’un fichier.Rules can fire when the store is initially being loaded from a file. Pour éviter de répondre à ces modifications, utilisez :To avoid responding to these changes, use:

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