Partilhar via


Como: usar transações para atualizar o modelo

Transações Certifique-se de que as alterações feitas no armazenamento são tratadas como um grupo.As alterações que são agrupadas podem ser confirmadas ou revertidas como uma única unidade.

Sempre que seu código de programa modifica, adiciona ou exclui qualquer elemento no armazenamento em Visual Studio visualização e modelagem SDK, deverá fazê-lo dentro de uma transação.Deve haver uma ocorrência ativa do Transaction associados com o armazenamento quando a alteração ocorre.Isso se aplica a todos os elementos de modelo, relacionamentos, formas, diagramas e suas propriedades.

O mecanismo de transação ajuda você a evitar estados inconsistentes.Se ocorrer um erro durante uma transação, todas as alterações serão revertidas.Se o usuário executa um comando Desfazer, cada transação recente é tratada como uma única etapa.O usuário não pode desfazer uma alteração recente, em parte, a menos que você explicitamente colocá-los em transações separadas.

Abrindo uma transação

O método mais conveniente de gerenciar uma transação é com um using instrução incluído em um try...catch instrução:

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

Se uma exceção que impede que o final Commit() ocorre durante as alterações, o armazenamento será redefinido para seu estado anterior.Isso ajuda você a certificar-se de que erros não deixam o modelo em um estado inconsistente.

Você pode fazer qualquer número de alterações dentro de uma transação.Você pode abrir novas transações dentro de uma transação ativa.As transações aninhadas devem confirmar ou reverter antes do término da transação que o contém.Para obter mais informações, consulte o exemplo para o TransactionDepth propriedade.

Para tornar as alterações permanentes, você deve Commit a transação antes que ele é descartado.Se ocorrer uma exceção não detectada dentro da transação, o armazenamento será redefinido para seu estado antes das alterações.

Reverter uma transação

Para garantir que o armazenamento permanece em ou é revertido para seu estado antes da transação, você pode usar qualquer uma nestas táticas:

  1. Elevar uma exceção não detectada dentro do escopo da transação.

  2. Explicitamente reverta a transação:

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

Transações não afetam os objetos de armazenamento não

As transações só regem o estado do armazenamento.Eles não podem desfazer alterações parciais que foram feitas em itens externos como, por exemplo, arquivos, bancos de dados ou objetos que você tenha declarado com tipos comuns de fora da definição de DSL.

Se uma exceção pode deixar tal alteração inconsistente com o armazenamento, você deve lidar com essa possibilidade no manipulador de exceção.Uma maneira de certificar-se de que os recursos externos permaneçam sincronizados com os objetos de armazenamento é associam cada objeto externo a um elemento na loja usando manipuladores de eventos.Para obter mais informações, consulte Manipuladores de eventos propagam alterações fora do modelo.

Regras de incêndio no final de uma transação

No final de uma transação, antes que a transação é descartada, as regras anexadas a elementos do repositório são acionadas.Cada regra é um método que é aplicado a um elemento de modelo que foi alterado.Por exemplo, existem regras de "Corrigir" atualizar o estado de uma forma quando seu elemento de modelo foi alterado e que criar uma forma, quando um elemento de modelo é criado.Há uma ordem de acionamento especificado.Uma alteração feita por uma regra pode ser acionados por outra regra.

Você pode definir suas próprias regras.Para obter mais informações sobre as regras, consulte Respondendo a e propagação de alterações.

As regras não são acionados após uma operação de refazer de desfazer ou um comando de reversão.

Contexto de transação

Cada transação tem um dicionário na qual você pode armazenar qualquer informação que você deseja:

store.TransactionManager

.CurrentTransaction.TopLevelTransaction

.Context.Add(aKey, aValue);

Isso é especialmente útil para transferir informações entre as regras.

Estado de transação

Em alguns casos, a que você precisa para evitar propagação de uma alteração se a alteração é causada por desfazer ou refazer uma transação.Isso pode acontecer, por exemplo, se você escrever um manipulador de valor de propriedade que pode atualizar o outro valor no armazenamento.Porque a operação de desfazer redefine todos os valores no armazenamento para seus estados anteriores, não é necessário calcular os valores atualizados.Use este código:

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

As regras podem ser acionados quando o armazenamento inicialmente está sendo carregado a partir de um arquivo.Para evitar responder a essas alterações, use:

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