ฉันกำลังเขียนการทดสอบการรวมซึ่งฉันจะแทรกวัตถุจำนวนหนึ่งลงในฐานข้อมูลจากนั้นตรวจสอบเพื่อให้แน่ใจว่าวิธีการของฉันดึงวัตถุเหล่านั้นมาหรือไม่
การเชื่อมต่อกับฐานข้อมูลของฉันคือผ่าน NHibernate ... และวิธีการสร้างการทดสอบตามปกติของฉันคือการทำสิ่งต่อไปนี้:
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();
อย่างไรก็ตามฉันเพิ่งค้นพบเกี่ยวกับTransactionScopeซึ่งเห็นได้ชัดว่าสามารถใช้เพื่อจุดประสงค์นี้ ...
บางโค้ดตัวอย่างที่ฉันได้พบจะเป็นดังนี้:
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;
}
ฉันเชื่อว่าถ้าฉันไม่รวมบรรทัดtxScope.Complete()
ที่ข้อมูลที่แทรกจะถูกย้อนกลับ แต่น่าเสียดายที่ฉันไม่เข้าใจว่ามันเป็นไปได้อย่างไร ... txScope
วัตถุจะติดตามdeptAdapter
และempAdapter
วัตถุและธุรกรรมบนฐานข้อมูลได้อย่างไร
ฉันรู้สึกว่าฉันขาดข้อมูลเล็กน้อยที่นี่ ... ฉันสามารถแทนที่BeginTransaction()
และRollbackTransaction(
) การโทรโดยใช้รหัสของฉันได้TransactionScope
หรือไม่?
ถ้าไม่แล้วTransactionScope
จะย้อนกลับธุรกรรมได้อย่างไร?