valid transaction the practices not framework for best sql oracle entity-framework transactions transactionscope

the - EF y TransactionScope para SQL Server y Oracle sin escalar/expandirse a DTC?



the operation is not valid for the state of the transaction (2)

¿Alguien puede actualizarme sobre este tema?

Quiero admitir tanto SQL Server como Oracle en mi aplicación.

¿Es posible tener el siguiente código (en BL) funcionando para SQL Server y Oracle sin escalar / expandir a transacciones distribuidas (DTC)?

// dbcontext is created before, same dbcontext will be used by both repositories using (var ts = new TransactionScope()) { // create order - make use of dbcontext, possibly to call SaveChanges here orderRepository.CreateOrder(order); // update inventory - make use of same dbcontext, possibly to call SaveChanges here inventoryRepository.UpdateInventory(inventory); ts.Complete(); }

A partir de hoy, a fines de agosto de 2013, entiendo que funciona para SQL Server 2008+ ... pero ¿qué pasa con Oracle? Encontré este hilo ... parece que Oracle está promocionando las transacciones distribuidas, pero todavía no está claro para mí.

¿Alguien tiene experiencia con la escritura de aplicaciones para admitir SQL Server y Oracle con Entity Framework para iluminarme?

¡Gracias!

Actualización: Finalmente noté que EF6 viene con Soporte de transacción mejorado . Esto, además de las recomendaciones de Remus podría ser la solución para mí.


No, se necesita DTC para transacciones distribuidas, y algo que abarca 2 tecnologías de bases de datos diferentes como esta es una transacción distribuida. ¡Lo siento!


Primero: nunca use var ts = new TransactionScope() . Es el trazador de líneas que mata a su aplicación. Utilice siempre el constructor explícito que le permite especificar el nivel de aislamiento. Consulte el uso de TransactionScope () nuevo considerado dañino .

Ahora sobre su pregunta: la lógica de no promover dos conexiones en el mismo alcance en DTC se basa en gran medida en el controlador / proveedores que cooperan para informar al Sistema. Transacciones de que las dos conexiones distintas son capaces de administrar la transacción distribuida por sí solas, porque los administradores de recursos involucrados son los mismos. SqlClient post SQL Server 2008 es un controlador que es capaz de hacer esta lógica. El controlador de Oracle que utiliza no es (y no conozco ninguna versión que sea, por cierto).

En definitiva, es realmente realmente básico: si no quieres un DTC, ¡no crees uno! Asegúrese de utilizar exactamente una conexión en el alcance. Es claramente discutible que no necesita dos conexiones. En otras palabras, deshágase de los dos repositorios separados en su modelo de datos. Use solo un repositorio para Pedidos, Inventario y qué más qué no. Te disparas en el pie con ellos y estás pidiendo soluciones de polvo de duendes.

Actualización: controlador Oracle 12c r1 :

"Asociación de transacciones y conexiones: las conexiones ODP.NET, de forma predeterminada, se separan de las transacciones solo cuando los objetos de conexión se cierran o se eliminan los objetos de la transacción"