3

プロジェクトでトランザクションを機能させる方法を理解しようとしています。Oracle11gデータベースでEntityFramework4を使用しています。

ここで彼の取引は、私が行うべき多くの操作があり、予期しない例外がスローされたときにロールバックしたいと思います。単純な操作で複数のクラスがあり、各クラスは独自のコンテキストを作成し、いくつかの変更を加えます。次に例を示します。

public class OneDaoFactory
{
    public int AddTreatment(Dto dto)
    {
        using (Context bdd = new Context())
        {
            //Make some changes in database
            bdd.SaveChanges();
        }
    }
}

これで、ファクトリからメソッドを呼び出すビジネスができました。

public void Business()
{
    try
    {
        OneDaoFactory.AddTreatment(dto);
        SecondDaoFactory.Add(dto2);
        throw new Exception("make a rollback");
    }
    catch(Exception ex)
    {
        //rollback
    }
}

工場で作成されたすべてのコンテキストを管理するトランザクションをビジネスで作成する方法はありますか?ビジネスでコンテキストを作成し、それをすべてのDaoFactoriesに渡す以外に?

私はについてのことを見つけましたTransactionScope、しかし私が見たものから、それはSqlServerのためです。接続とトランザクションを手動で開こうとしましたが、コンテキストが独自のコンテキストを再開しているように見えるため、ロールバックは何もしませんでした。

編集

可能であれば、EFへの言及をビジネスに含めたくありません。別のファクトリを使用してトランザクションを開いたり閉じたりするのと同じように

4

1 に答える 1

3

これを行うには、独自の接続EntityConnectionを開き、トランザクションを開いて、接続をオブジェクトコンテキストに渡します。

public class OneDaoFactory
{
    private EntityConnection conn; // initialize from outside

    //...

    public int AddTreatment(Dto dto)
    {
        using (Context bdd = new Context(conn))
        {
            //Make some changes in database
            bdd.SaveChanges();
        }
    }
}


public void Business()
{
    EntityConnection conn = new EntityConnection(ConnectionString);
    OneDaoFactory.SetConnection( conn );
    SecondDaoFactory.SetConnection( conn );

    using( var ts = new TransactionScope())
    {
        OneDaoFactory.AddTreatment(dto);
        SecondDaoFactory.Add(dto2);
        throw new Exception("make a rollback);

        ts.Complete();
    }
}

お役に立てれば。

于 2012-08-21T10:32:51.843 に答える