3

私は最も単純なことをして、CreatePortalメソッドにトランザクションを適用しようとしています。

私が使用している場合TransactionScope- 何らかの理由で DTC に昇格します - BAD。

using (var ts = new TransactionScope())
{
    var portalController = new PortalController();

    var portalId =
        portalController.CreatePortal(
                    "TESTTESTTEST",
                    string.Empty,
                    string.Empty,
                    "TESTTESTTEST_" + new Random().Next(999999),
                    UserController.GeneratePassword(),
                    "TESTTESTTEST_" + new Random().Next(999999) + "@something.com",
                    string.Empty,
                    string.Empty,
                    Globals.ApplicationMapPath + "/Portals/_default/",
                    "Default Website.template",
                    "Portals/TESTTEST",
                    "TESTTESTTEST",
                    string.Empty,
                    string.Empty,
                    false);

    ts.Complete();
}

私が使用していて最後DataProvider.Instance().GetTransactionに実行RollbackTransactionする場合-ITはロールバックしません。つまり、トランザクションは機能しませんでした。

var t = Data.DataProvider.Instance().GetTransaction();

var portalController = new PortalController();

var portalId =
    portalController.CreatePortal(
                "TESTTESTTEST",
                string.Empty,
                string.Empty,
                "TESTTESTTEST_" + new Random().Next(999999),
                UserController.GeneratePassword(),
                "TESTTESTTEST_" + new Random().Next(999999) + "@something.com",
                string.Empty,
                string.Empty,
                Globals.ApplicationMapPath + "/Portals/_default/",
                "Default Website.template",
                "Portals/TESTTEST",
                "TESTTESTTEST",
                string.Empty,
                string.Empty,
                false);

Data.DataProvider.Instance().RollbackTransaction(t);

では、DotNetNuke でトランザクションを使用する方法は?

4

2 に答える 2

1

GetTransactionメソッドを使用してトランザクションを作成するDataProviderと、新しい接続が作成され、トランザクションが提供されます。次に、そのトランザクションを手動で使用して、データベースに対して実行するアクションを実行する必要があります。そのトランザクションを渡して、たとえば、CreatePortalまたはその他の組み込みDNN関数で使用されるようにする方法はありません。その機能は、追加のデータベースアクセスのためだけのもののようです。

DNNコアからの呼び出しをトランザクションでラップする方法に関しては、できないと思います。私が推奨する最もクリーンなソリューション(残念ながら、まだあまりクリーンではありません)は、コントローラークラスを経由するのではなく、トランザクションを使用してストアドプロシージャを手動で呼び出すことです。

あなたのユースケースは何ですか、多分私は他の方法で問題を解決する解決策をお勧めすることができます...

于 2009-09-25T20:19:02.140 に答える