Estamos en un proceso de sustitución gradual del código de acceso a datos heredado por entidad de marco (4.3.1). En algunas ocasiones, no podemos evitar utilizar ambas formas de acceso a datos en una unidad de trabajo. Idealmente, esto debería hacerse en una transacción. Sin embargo, el código anterior usa SqlTransaction
s que llama al Commit()
cuando se realiza una unidad de trabajo y EF gestiona sus propias transacciones.Ignorar SqlTransaction.Commit dentro de TransactionScope
Así que pensamos en envolver el código "antiguo" y "nuevo" en un TransactionScope
. Sin embargo, un Compromiso dentro de un entorno TransactionScope
siempre se ejecuta, incluso si el TransactionScope
no se completa. Este fragmento de código ilustra mi problema:
using (var conn = new SqlConnection("connection string"))
{
conn.Open();
using (var scope = new TransactionScope())
{
using (var tr = conn.BeginTransaction())
{
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = tr;
cmd.CommandText = "some update statement";
cmd.ExecuteNonQuery();
}
tr.Commit();
}
// In reality the code above is part of a legacy DAL, immutable.
// (can't insert SaveChanges before tr.Commit).
context.SaveChanges();
if (<all ok>) // pseudo code for exception handling.
scope.Complete();
}
}
La instrucción de actualización sigue apostando cuando scope.Complete()
no es golpeado.
Así que, como parece, no puedo usar TransactionScope
para forzar el código de acceso a datos anterior y SaveChanges
desde un contexto para ejecutar en una transacción. ¿O hay alguna manera de anular la instrucción SqlTransaction.Commit?
Sé que hay más publicaciones aquí sobre TransactionScope y SqlTransaction, pero todas (con razón) dicen que usar SqlTransaction no es necesario (ni se recomienda) cuando se usa TransactionScope. Pero no usar SqlTransaction no es una opción aquí. Tenemos un marco heredado que compromete su propio SqlTransaction
sy que no tiene una API para enganchar en su mecanismo de transacción.
¿Al menos tiene acceso a la conexión? –
@LadislavMrnka No, aparte de la cadena de conexión en el archivo de configuración. –