Ich schreibe einen Integrationstest, bei dem ich eine Reihe von Objekten in eine Datenbank einfüge und dann überprüfe, ob meine Methode diese Objekte abruft.
Meine Verbindung zur Datenbank erfolgt über NHibernate ... und meine übliche Methode zum Erstellen eines solchen Tests besteht darin, Folgendes zu tun:
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();
Ich habe jedoch kürzlich von TransactionScope erfahren, das anscheinend genau für diesen Zweck verwendet werden kann ...
Ein Beispielcode, den ich gefunden habe, lautet wie folgt:
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;
}
Ich glaube, wenn ich die Zeile nicht einbeziehe txScope.Complete()
, werden die eingefügten Daten zurückgesetzt. Aber leider verstehe ich nicht, wie das möglich ist ... wie verfolgt das txScope
Objekt die deptAdapter
und empAdapter
Objekte und ihre Transaktionen in der Datenbank.
Ich habe das Gefühl, dass mir hier ein paar Informationen fehlen ... Kann ich meine BeginTransaction()
und RollbackTransaction(
) Anrufe wirklich ersetzen, indem ich meinen Code mit umhülle TransactionScope
?
Wenn nicht, wie funktioniert dann das TransactionScope
Zurücksetzen von Transaktionen?