誰かが私を助けてくれることを願って、私は数日間私を夢中にさせる問題に直面しています。ここにあります ;
私は EF4 を oracle データベースで使用しており、devart の dotConnect for oracle をプロバイダーとして使用しています。以下の DeleteCabinet メソッドを呼び出す wcf サービス メソッドがあります。
public void DeleteCabinet(string pRID)
{
using(TransactionScope tranScope = new TransactionScope())
{
DBUtils.DeleteCabinetAndShelves(pRecordId);
//throw exception to test record not deleted
throw new Exception("xxx something has happened test xxx");
tranScope.Complete();
}
}
DBUtils.DeleteCabinetAndShelves は次のようになります。
public void DeleteCabinetAndShelves(string pRecordId)
{
using(var context = new EdrmEntities())
{
var cabinet = context.Cabinets.Include("Shelves").Single(p => p.RID == pCabinetRID);
//mark all cabinet shelves for deletion
if (cabinet.Shelves != null)
{
foreach (var tempShelf in cabinet.Shelves.ToList())
{
context.DeleteObject(tempShelf);
}
}
//mark cabinet for deletion
context.DeleteObject(cabinet);
//save
context.SaveChanges();
}
}
テスト プロジェクト内から DeleteCabinet を呼び出すと、wcf 呼び出しではなく、メソッドを直接呼び出すと、問題なく動作します。例外がスローされ、トランザクションがロールバックされます。したがって、期待どおりにDBからレコードが削除されません
問題は、クライアントからサービス メソッド (DeleteCabinet を呼び出す) を呼び出すと、例外がスローされますが、レコードは db から削除されます。トランザクションはロールバックしません!
wcf メソッドを呼び出してもトランザクションはロールバックされないようですが、(少なくとも私には) クレイジーに思えます。
前もって感謝します