Agregar transacciones explícitas a un servicio de dominio
En este tema se explica cómo se pueden utilizar transacciones explícitas en el servicio de dominio de WCF RIA Services para garantizar que un conjunto de cambios se realice como un grupo. Cuando se llama a SubmitChanges desde el cliente en el elemento DomainContext, se llama a Submit en el servidor. De este modo, se pueden incorporar transacciones reemplazando el método Submit por la implementación base e incluyéndola en un ámbito de transacción. Esta, a su vez, llama al elemento PersistChangeSet que finaliza todas las operaciones CUD (creación, actualización y eliminación) que se han invocado.
Este procedimiento solamente se requiere para integrar transacciones en un servicio de dominio que derive directamente de la clase DomainService, como sucede, por ejemplo, cuando se trabaja con modelos de datos definidos POCO (objetos XLR convencionales). Cuando el servicio de dominio se deriva de LinqToEntitiesDomainService utilizando Entity Framework, la transacción se controla automáticamente.
El procedimiento descrito en este tema da por supuesto que ha creado una aplicación de RIA Services . Los procedimientos para realizar esta acción se pueden seguir en el tema Tutorial: crear una solución de RIA Services.
Para crear una transacción explícita
Haga clic con el botón de secundario en el proyecto de servidor y seleccione la opción Agregar referencia para abrir la ventana Agregar referencia. En la pestaña .NET, busque y seleccione el ensamblado System.Transactions y, a continuación, haga clic en Aceptar.
En el servicio de dominio, reemplace el método Submit.
Cree un ámbito de transacción que contenga una llamada a la implementación base del método Submit.
Compruebe la propiedad HasError en el objeto ChangeSet antes de completar la transacción.
En el ejemplo siguiente se muestra una transacción explícita para un servicio de dominio.
<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; } }