Sto scrivendo un test di integrazione in cui inserirò un numero di oggetti in un database e quindi verificherò se il mio metodo recupera quegli oggetti.
La mia connessione al database avviene tramite NHibernate ... e il mio metodo abituale per creare un test di questo tipo sarebbe di fare quanto segue:
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();
Tuttavia, di recente ho scoperto TransactionScope che apparentemente può essere utilizzato proprio per questo scopo ...
Alcuni esempi di codice che ho trovato sono i seguenti:
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;
}
Credo che se non includo la riga, txScope.Complete()
i dati inseriti verranno annullati. Ma purtroppo non capisco come ciò sia possibile ... come fa l' txScope
oggetto di tenere una traccia delle deptAdapter
e empAdapter
oggetti e le loro transazioni sul database.
Mi sento come se mi mancassero un po 'di informazioni qui ... sono davvero in grado di sostituire le mie chiamate BeginTransaction()
and RollbackTransaction(
) circondando il mio codice usando TransactionScope
?
In caso contrario, come TransactionScope
funziona il rollback delle transazioni?