次の方法で共有


方法: ドメイン サービスに明示的なトランザクションを追加する

ここでは、WCF RIA サービス ドメイン サービスで明示的なトランザクションを使用して、一連の変更がグループとして実行されるようにする方法について説明します。DomainContext でクライアントから SubmitChanges を呼び出すと、サーバーの Submit が呼び出されます。したがって、トランザクションを組み込むには、基本実装を使用して Submit メソッドをオーバーライドし、それをトランザクション スコープにラップします。これにより、PersistChangeSet が呼び出され、呼び出されたすべての CUD (作成、更新、および削除) 操作が終了します。

この処理が必要なのは、DomainService クラスから直接派生するドメイン サービスにトランザクションを統合する場合のみです。たとえば、POCO (Plain Old XLR Objects) 定義のデータ モデルを操作する場合が、これに該当します。Entity Framework を使用してドメイン サービスが LinqToEntitiesDomainService から派生するときに、トランザクションが自動的に処理されます。

このトピックの手順では、RIA サービス アプリケーションを作成済みであることを前提としています。この操作を実行する手順は、「チュートリアル: RIA Services ソリューションの作成」に記載されています。

明示的なトランザクションを作成するには

  1. サーバー プロジェクトを右クリックし、[参照の追加] をクリックして [参照の追加] ウィンドウを表示します。[.NET] タブで、System.Transactions アセンブリを選択し、[OK] をクリックします。

  2. ドメイン サービスで、Submit メソッドをオーバーライドします。

  3. Submit メソッドの基本実装への呼び出しをラップするトランザクション スコープを作成します。

  4. トランザクションを完了する前に、ChangeSet オブジェクトで HasError プロパティをチェックします。

    次の例は、ドメイン サービスの明示的なトランザクションを示しています。

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