Estou escrevendo um teste de integração onde irei inserir vários objetos em um banco de dados e, em seguida, verificar se meu método recupera esses objetos.
Minha conexão com o banco de dados é através do NHibernate ... e meu método usual de criar tal teste seria fazer o seguinte:
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();
No entanto, descobri recentemente sobre o TransactionScope, que aparentemente pode ser usado para essa finalidade ...
Alguns exemplos de código que encontrei são os seguintes:
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;
}
Acredito que se não incluir a linha txScope.Complete()que os dados inseridos serão revertidos. Mas, infelizmente, eu não entendo como isso é possível ... como é que o txScopeobjeto manter uma faixa da deptAdaptere empAdapterobjetos e suas transações no banco de dados.
Sinto que estou faltando um pouco de informação aqui ... sou realmente capaz de substituir minhas chamadas BeginTransaction()e RollbackTransaction() cercando meu código usando TransactionScope?
Se não, como TransactionScopefunciona para reverter as transações?