最佳答案
我正在编写一个集成测试,其中我将向数据库中插入一些对象,然后检查以确保我的方法是否检索到这些对象。
我通过 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
对象及其事务。
我觉得我在这里遗漏了一些信息... ... 我真的能够用 TransactionScope
包围我的代码来替换我的 BeginTransaction()
和 RollbackTransaction(
)调用吗?
如果没有,那么 TransactionScope
如何回滚事务?