Estoy escribiendo una prueba de integración en la que insertaré varios objetos en una base de datos y luego verificaré si mi método recupera esos objetos.
Mi conexión a la base de datos es a través de NHibernate ... y mi método habitual para crear una prueba de este tipo sería hacer lo siguiente:
NHibernateSession.BeginTransaction();
//use nhibernate to insert objects into database
//retrieve objects via my method
//verify actual objects returned are the same as those inserted
NHibernateSession.RollbackTransaction();
Sin embargo, recientemente descubrí TransactionScope, que aparentemente se puede usar para este mismo propósito ...
Un código de ejemplo que encontré es el siguiente:
public static int AddDepartmentWithEmployees(Department dept)
{
int res = 0;
DepartmentAdapter deptAdapter = new DepartmentAdapter();
EmployeeAdapter empAdapter = new EmployeeAdapter();
using (TransactionScope txScope = new TransactionScope())
{
res += deptAdapter.Insert(dept.DepartmentName);
//Custom method made to return Department ID
//after inserting the department "Identity Column"
dept.DepartmentID = deptAdapter.GetInsertReturnValue();
foreach(Employee emp in dept.Employees)
{
emp.EmployeeDeptID = dept.DepartmentID;
res += empAdapter.Insert(emp.EmployeeName, emp.EmployeeDeptID);
}
txScope.Complete();
}
return res;
}
Creo que si no incluyo la línea, txScope.Complete()
los datos insertados se revertirán. Pero, por desgracia no entiendo cómo es posible ... ¿cómo el txScope
objeto mantener un seguimiento de la deptAdapter
y empAdapter
los objetos y sus transacciones en la base de datos.
Siento que me falta un poco de información aquí ... ¿realmente puedo reemplazar mis llamadas BeginTransaction()
y RollbackTransaction(
) rodeando mi código usando TransactionScope
?
Si no es así, ¿cómo funciona entonces TransactionScope
revertir las transacciones?