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' txScopeoggetto di tenere una traccia delle deptAdaptere empAdapteroggetti 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 TransactionScopefunziona il rollback delle transazioni?