Tôi đang viết một bài kiểm tra tích hợp trong đó tôi sẽ chèn một số đối tượng vào cơ sở dữ liệu và sau đó kiểm tra để đảm bảo phương pháp của tôi có truy xuất các đối tượng đó hay không.
Kết nối của tôi với cơ sở dữ liệu là thông qua NHibernate ... và phương pháp thông thường của tôi để tạo một bài kiểm tra như vậy là thực hiện như sau:
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();
Tuy nhiên, gần đây tôi đã tìm hiểu về TransactionScope có thể được sử dụng cho mục đích này ...
Một số mã ví dụ tôi đã tìm thấy như sau:
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;
}
Tôi tin rằng nếu tôi không bao gồm dòng txScope.Complete()
, dữ liệu được chèn vào sẽ được khôi phục lại. Nhưng tiếc là tôi không hiểu làm thế nào mà có thể ... làm thế nào để txScope
đối tượng giữ một ca khúc của deptAdapter
và empAdapter
các đối tượng và các giao dịch của họ trên cơ sở dữ liệu.
Tôi cảm thấy như mình đang thiếu một chút thông tin ở đây ... tôi có thực sự có thể thay thế các cuộc gọi BeginTransaction()
và RollbackTransaction(
) của mình bằng cách sử dụng mã của mình TransactionScope
không?
Nếu không, thì làm thế nào TransactionScope
để khôi phục các giao dịch?