如何:将显式事务添加到域服务

本主题说明如何使用 WCF RIA Services 域服务中的显式事务,以保证将一系列更改作为一个组来执行。当您从客户端调用 DomainContext 上的 SubmitChanges 时,它会调用服务器上的 Submit。所以,可以通过用基实现重写 Submit 方法并将它包装到事务范围中来合并事务。它反过来会调用终止所有已调用的 CUD(创建、更新和删除)操作的 PersistChangeSet。

只是在将事务集成到直接从 DomainService 类派生的域服务中时,例如,像使用 POCO(纯旧式 XLR 对象)定义的数据模型的这种情况,才需要此过程。当域服务从使用实体框架的 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;
        }
    }