2011-11-21 8 views
5

He estado tratando de diferentes maneras para hacer funcionar un conjunto simple de transacciones para una situación simple de cliente/servidor de WCF. Mi servidor WCF tiene una declaración de nivel de clase de la clase Entity Framework para mi acceso a la base de datos y varios métodos para modificar los datos y un método para SaveChanges. Estoy usando Oracle Data Access (ODP.NET).¿Cómo puedo obtener Entity Framework y WCF para trabajar con las transacciones? De acuerdo ... ¿cuál es el secreto?

Por ejemplo, quiero llamar a una modificación desde el cliente y luego a una llamada por separado para guardar los cambios en el servicio WCF. No funciona Básicamente, todo se ejecuta correctamente, pero cuando se realiza la segunda llamada para guardar los cambios, el servicio WCF ya no tiene el contexto original y, por lo tanto, no se guardan los cambios (y, en consecuencia, la llamada anterior que realizó los cambios se retrotrae automáticamente) .

Estoy utilizando el alcance de transacción en torno a ambas operaciones en mi cliente y ejecutando Complete() una vez hecho. Mis servicios WCF tienen OperationContract que usan [TransactionFlow(TransactionFlowOption.Mandatory)] y esas implementaciones de método usan [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]. Finalmente, mi configuración web está configurada con un wsHttpBinding que tiene la propiedad transactionFlow establecida en True.

No estoy teniendo suerte. No importa lo que intente, cuando intento presionar el servicio para guardar el seguimiento, el contexto EF ya se ha renovado.

+0

No todas las vinculaciones admiten transacciones. http://www.wrox.com/WileyCDA/Section/Transactions-in-WCF-and-NET.id-305253.html – faester

+0

¿Cómo maneja la sesión entre llamadas? WCF es apátrida por defecto, así que a menos que esté ordenando a WCF que haga algo con el estado, es posible que esté perdiendo algo. –

+0

Son entidades generadas por edmx o generado poco – Praneeth

Respuesta

4

Esto no tiene nada que ver con la transacción. La transacción funciona en el recurso transaccional pero sin llamar al SaveChanges en la primera solicitud no había recurso transaccional activo porque el contexto EF no es parte de la transacción; la base de datos está y la base de datos se ve afectada solo cuando llama al SaveChanges. Para que esto funcione, no necesita transacciones distribuidas. Necesita un servicio de sesión completa y almacenar el contexto EF en la instancia de servicio. Si un cliente usa la misma instancia proxy de cliente para comunicarse con el servicio para todas las solicitudes, la comunicación será manejada por la misma instancia de servicio = misma instancia de contexto EF que recordará los cambios de llamadas anteriores.

En mi humilde opinión esto es muy mala arquitectura. Simplemente no lo use. Exponer métodos especializados en el servicio WCF que hará cambios y los guardará. Si necesita ejecutar estos métodos en una transacción con otros recursos transaccionales, use la transacción real distribuida.

+0

Respeto tu respuesta. Y, temía que esa sería la respuesta. Gorrón. Desafortunadamente, degrada el uso de mi servicio. Por ejemplo, si quiero permitir a los usuarios de mi servicio crear pedidos y/o crear/modificar elementos extraños a esos pedidos (como detalles del producto) y permitirles que se unan en una sola transacción si realizan ambas acciones, puede se hará de forma atómica (pase múltiple). Eso apesta, pero entiendo lo que dices. Gracias por tu respuesta. – Prethen

1

esto podría ser un motivo. Ya que estás haciendo una actualización en el contexto diferente. contexto no sabe que el objeto se actualiza para decir el contexto en que se modificó el objeto y luego llama a savechnages(). Vea si ayuda

+0

Tiene razón. Básicamente, esto es lo que notó el respondedor anterior. Es una pena que no pueda hacerlo sin hacer que el Contexto y el servicio sean concisos. – Prethen

Cuestiones relacionadas