方法: ドメイン サービスに明示的なトランザクションを追加する
ここでは、WCF RIA サービス ドメイン サービスで明示的なトランザクションを使用して、一連の変更がグループとして実行されるようにする方法について説明します。DomainContext でクライアントから SubmitChanges を呼び出すと、サーバーの Submit が呼び出されます。したがって、トランザクションを組み込むには、基本実装を使用して Submit メソッドをオーバーライドし、それをトランザクション スコープにラップします。これにより、PersistChangeSet が呼び出され、呼び出されたすべての CUD (作成、更新、および削除) 操作が終了します。
この処理が必要なのは、DomainService クラスから直接派生するドメイン サービスにトランザクションを統合する場合のみです。たとえば、POCO (Plain Old XLR Objects) 定義のデータ モデルを操作する場合が、これに該当します。Entity Framework を使用してドメイン サービスが LinqToEntitiesDomainService から派生するときに、トランザクションが自動的に処理されます。
このトピックの手順では、RIA サービス アプリケーションを作成済みであることを前提としています。この操作を実行する手順は、「チュートリアル: RIA Services ソリューションの作成」に記載されています。
明示的なトランザクションを作成するには
サーバー プロジェクトを右クリックし、[参照の追加] をクリックして [参照の追加] ウィンドウを表示します。[.NET] タブで、System.Transactions アセンブリを選択し、[OK] をクリックします。
ドメイン サービスで、Submit メソッドをオーバーライドします。
Submit メソッドの基本実装への呼び出しをラップするトランザクション スコープを作成します。
トランザクションを完了する前に、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; } }