如何:将显式事务添加到域服务
本主题说明如何使用 WCF RIA Services 域服务中的显式事务,以保证将一系列更改作为一个组来执行。当您从客户端调用 DomainContext 上的 SubmitChanges 时,它会调用服务器上的 Submit。所以,可以通过用基实现重写 Submit 方法并将它包装到事务范围中来合并事务。它反过来会调用终止所有已调用的 CUD(创建、更新和删除)操作的 PersistChangeSet。
只是在将事务集成到直接从 DomainService 类派生的域服务中时,例如,像使用 POCO(纯旧式 XLR 对象)定义的数据模型的这种情况,才需要此过程。当域服务从使用实体框架的 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; } }