J'écris un test d'intégration dans lequel j'insérerai un certain nombre d'objets dans une base de données, puis je vérifierai si ma méthode récupère ces objets.
Ma connexion à la base de données se fait via NHibernate ... et ma méthode habituelle pour créer un tel test serait de faire ce qui suit:
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();
Cependant, j'ai récemment découvert TransactionScope qui peut apparemment être utilisé à cette fin ...
Un exemple de code que j'ai trouvé est le suivant:
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;
}
Je crois que si je n'inclus pas la ligne txScope.Complete()
, les données insérées seront annulées. Mais malheureusement , je ne comprends pas comment cela est possible ... comment l' txScope
objet garder une trace du deptAdapter
et des empAdapter
objets et de leurs transactions sur la base de données.
J'ai l'impression qu'il me manque un peu d'informations ici ... Suis-je vraiment capable de remplacer mes appels BeginTransaction()
et RollbackTransaction(
) en entourant mon code en utilisant TransactionScope
?
Sinon, comment TransactionScope
fonctionne-t-il pour annuler les transactions?