複数のオブジェクトをデータベースに挿入する統合テストを作成していて、メソッドがそれらのオブジェクトを取得するかどうかを確認しています。
データベースへの接続は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
トランザクションはどのようにロールバックされますか?