Piszę test integracji, w którym wstawię wiele obiektów do bazy danych, a następnie sprawdzę, czy moja metoda pobiera te obiekty.
Moje połączenie z bazą danych odbywa się przez NHibernate ... a moja zwykła metoda tworzenia takiego testu polega na wykonaniu następujących czynności:
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();
Jednak niedawno dowiedziałem się o TransactionScope, który podobno może być użyty do tego właśnie celu ...
Oto przykładowy kod, który znalazłem :
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;
}
Uważam, że jeśli nie dołączę wiersza txScope.Complete()
, wstawione dane zostaną wycofane. Ale niestety ja nie rozumiem, jak to jest możliwe ... w jaki sposób txScope
obiekt zachować ścieżki deptAdapter
i empAdapter
obiektów oraz ich transakcji w bazie danych.
Czuję, że brakuje mi tu trochę informacji ... czy naprawdę jestem w stanie zastąpić moje wywołania BeginTransaction()
i RollbackTransaction(
) otaczając mój kod za pomocą TransactionScope
?
Jeśli nie, to jak TransactionScope
działa wycofywanie transakcji?