Gewusst wie: Hinzufügen von expliziten Transaktionen zu einem Domänendienst

In diesem Thema wird erläutert, wie Sie mithilfe von expliziten Transaktionen im WCF RIA Services-Domänendienst sicherstellen können, dass ein Satz von Änderungen als Gruppe ausgeführt wird. Wenn Sie auf dem Client SubmitChanges für den DomainContext aufrufen, wird auf dem Server Submit aufgerufen. Transaktionen können also umgesetzt werden, indem Sie die Submit-Methode mit der Basisimplementierung überschreiben und in einen Transaktionsbereich einschließen. Auf diese Weise wird im Anschluss PersistChangeSet aufgerufen, um alle initiierten CUD-Vorgänge (Create, Update und Delete) abzuschließen.

Dieses Verfahren ist nur erforderlich, um Transaktionen in einen Domänendienst zu integrieren, der direkt von der DomainService-Klasse abgeleitet ist. Dies ist z. B. der Fall, wenn Sie mit POCO-Datenmodellen (Plain Old XLR Objects) arbeiten. Wenn der Domänendienst unter Verwendung von Entity Framework von LinqToEntitiesDomainService abgeleitet ist, werden Transaktionen automatisch behandelt.

In dem Verfahren in diesem Thema wird davon ausgegangen, dass bereits eine RIA Services -Anwendung erstellt wurde. Die entsprechenden Verfahren finden Sie im Thema Exemplarische Vorgehensweise: Erstellen einer RIA Services-Projektmappe.

So erstellen Sie eine explizite Transaktion

  1. Klicken Sie mit der rechten Maustaste auf das Serverprojekt, und wählen Sie die Option Verweis hinzufügen aus, um das Fenster Verweis hinzufügen zu öffnen. Suchen und wählen Sie auf der Registerkarte .NET die Assembly System.Transactions aus, und klicken Sie anschließend auf OK.

  2. Überschreiben Sie im Domänendienst die Submit-Methode.

  3. Erstellen Sie einen Transaktionsbereich, der einen Aufruf der Basisimplementierung der Submit-Methode umschließt.

  4. Überprüfen Sie vor dem Abschließen der Transaktion die HasError-Eigenschaft des ChangeSet-Objekts.

    Das folgende Beispiel zeigt eine explizite Transaktion für einen Domänendienst.

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