Condividi tramite


Procedura: aggiungere transazioni esplicite a un servizio del dominio

In questo argomento viene illustrato come è possibile utilizzare le transazioni esplicite nel servizio del dominio di WCF RIA Services per garantire l'esecuzione di un set di modifiche come gruppo. Quando si chiama SubmitChanges dal client sull'oggetto DomainContext, nel server verrà chiamato Submit. Le transazioni possono pertanto essere incorporate eseguendo l'override del metodo Submit con l'implementazione di base ed eseguendone il wrapping in un ambito di transazione. In questo modo viene chiamato, a sua volta, l'oggetto PersistChangeSet che completa tutte le operazioni di creazione, aggiornamento ed eliminazione (CUD) che sono state richiamate.

Questa procedura è necessaria solo per integrare le transazioni in un servizio del dominio che deriva direttamente dalla classe DomainService, come accade ad esempio quando si utilizzano i modelli dati definiti da POCO (Plain Old XLR Objects). Quando il servizio del dominio deriva da LinqToEntitiesDomainService mediante Entity Framework, la transazione viene gestita automaticamente.

Nella procedura descritta in questo argomento si presuppone che sia già stata creata un'applicazione RIA Services . Le procedure per eseguire tale operazione sono illustrate nell'argomento Procedura dettagliata: creazione di una soluzione Servizi RIA.

Per creare una transazione esplicita

  1. Fare clic con il pulsante destro del mouse sul progetto server e scegliere l'opzione Aggiungi riferimento per aprire la finestra Aggiungi riferimento. Nella scheda .NET individuare e selezionare l'assembly System.Transactions, quindi fare clic su OK.

  2. Nel servizio del dominio eseguire l'override del metodo Submit.

  3. Creare un ambito della transazione che esegue il wrapping di una chiamata all'implementazione di base del metodo Submit.

  4. Controllare la proprietà HasError nell'oggetto ChangeSet prima di completare la transazione.

    Nell'esempio seguente viene illustrata una transazione esplicita per un servizio del dominio.

    <EnableClientAccess()>  _
    Public Class DomainService1
        Inherits DomainService
    
        Public Overrides Function Submit(ByVal changeSet As System.Web.DomainServices.ChangeSet) As Boolean
            Dim result As Boolean
    
            Using tx = New TransactionScope( _
                    TransactionScopeOption.Required, _
                    New TransactionOptions With {.IsolationLevel = IsolationLevel.ReadCommitted})
    
                result = MyBase.Submit(changeSet)
                If (Not Me.ChangeSet.HasError) Then
                    tx.Complete()
                End If
            End Using
            Return result
        End Function
    End Class
    
    [EnableClientAccess()]
    public class DomainService1 : DomainService
    {
        public override bool Submit(ChangeSet changeSet)
        {
            bool result = false;
    
            using (var tx = new TransactionScope(
                TransactionScopeOption.Required,
                new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })
                )
            {
                result = base.Submit(changeSet);
                if (!this.ChangeSet.HasError)
                {
                    tx.Complete();
                }
            }
    
            return result;
        }
    }