7

誰かが私を助けてくれることを願って、私は数日間私を夢中にさせる問題に直面しています。ここにあります ;

私は 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 メソッドを呼び出してもトランザクションはロールバックされないようですが、(少なくとも私には) クレイジーに思えます。

前もって感謝します

4

2 に答える 2

3

投稿にDevArtDotConnectタグを付けました...これは、WCF / Entity Framework / System.Transactions に固有のものではなく、DevArt プロバイダーのバグなのだろうかと思います。ObjectContext組み込みの SQL Server プロバイダー (または最近リリースされたOracle 独自の EF プロバイダー) を使用している で発生するかどうかを確認して理論をテストし、問題が引き続き発生するかどうかを確認できます。コードは 100% 正しいように見えるので、これしか考えられません。

于 2012-03-06T13:25:35.263 に答える
1

@Rabid と @luksans の建設的なコメントのおかげで問題は解決され、wcf や devart のプロバイダーのバグとは関係ないことが判明しました

つまりね ; wcf サービス (ロールバックしなかった) と統合テスト (ロールバックした) は異なるプロジェクト内にあるため、構成ファイルは異なります。それらは過去に同期していませんでしたが、違いはEnlist=false部分的です。したがって、wcf プロジェクトの接続文字列にはありますがEnlist=false、テスト プロジェクトにはありません。これが、WCF が失敗したトランザクションの幻想が生まれた方法です。

Enlist=falsewcf プロジェクトの接続文字列から削除すると、問題が修正されました。

于 2012-03-07T08:35:42.130 に答える