Share via


HOW TO:將明確交易加入至網域服務

本主題說明如何在 WCF RIA Services 網域服務中使用明確交易,以確保一組變更是以群組方式執行。當您從用戶端呼叫 DomainContextSubmitChanges 時,它會在伺服器上呼叫 Submit。因此可藉由以基底實作覆寫 Submit 方法並將它包裝在交易範圍,併入交易。接著會呼叫 PersistChangeSet,而完成所有已叫用的 CUD (建立、更新及刪除) 作業。

只有在網域服務直接衍生自 DomainService 類別,例如使用 POCO (單純 CLR 物件) 定義資料模型時,才需要這個程序將交易整合至網域服務。使用 Entity Framework,網域服務衍生自 LinqToEntitiesDomainService 時,則會自動處理交易。

本主題中說明的程序假設您已經建立 RIA Services 應用程式。這項工作的程序可依照逐步解說:建立 RIA Services 方案主題進行。

若要建立明確交易

  1. 以滑鼠右鍵按一下伺服器專案,然後選取 [加入參考] 選項以開啟 [加入參考] 視窗。在 [.NET] 索引標籤上,尋找並選取 System.Transactions 組件,然後按一下 [確定]。

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