HOW TO:將明確交易加入至網域服務
本主題說明如何在 WCF RIA Services 網域服務中使用明確交易,以確保一組變更是以群組方式執行。當您從用戶端呼叫 DomainContext 的 SubmitChanges 時,它會在伺服器上呼叫 Submit。因此可藉由以基底實作覆寫 Submit 方法並將它包裝在交易範圍,併入交易。接著會呼叫 PersistChangeSet,而完成所有已叫用的 CUD (建立、更新及刪除) 作業。
只有在網域服務直接衍生自 DomainService 類別,例如使用 POCO (單純 CLR 物件) 定義資料模型時,才需要這個程序將交易整合至網域服務。使用 Entity Framework,網域服務衍生自 LinqToEntitiesDomainService 時,則會自動處理交易。
本主題中說明的程序假設您已經建立 RIA Services 應用程式。這項工作的程序可依照逐步解說:建立 RIA Services 方案主題進行。
若要建立明確交易
以滑鼠右鍵按一下伺服器專案,然後選取 [加入參考] 選項以開啟 [加入參考] 視窗。在 [.NET] 索引標籤上,尋找並選取 System.Transactions 組件,然後按一下 [確定]。
在網域服務中,覆寫 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; } }