如何在DotNetNuke中使用交易?

时间:2009-09-25 17:31:16

标签: transactions transactionscope dotnetnuke

我正在尝试做最简单的事情并将事务应用于CreatePortal方法。

如果我正在使用TransactionScope - 它因某种未知原因而推广到DTC - 不好。

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 - 那么就不会回滚,这意味着交易甚至无效。

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中使用交易?

2 个答案:

答案 0 :(得分:1)

当您通过GetTransaction方法创建交易时,DataProvider只会创建一个新连接并为您提供交易。然后,您需要手动使用该事务来执行您将对数据库采取的任何操作。没有办法传递该事务,以便它被例如CreatePortal或任何其他内置DNN函数使用。该功能似乎只适用于您可能进行的任何其他数据库访问。

关于如何在事务中包装来自DNN核心的呼叫,我认为你不能。我知道推荐的最干净的解决方案(不幸的是,它仍然不是很干净)是使用事务手动调用存储过程,而不是通过控制器类。

你的用例是什么,也许我可以推荐一种解决问题的解决方案......

答案 1 :(得分:1)

我可以在this article的帮助下使用DNN中的交易。

它不适用于您的情况,但会帮助其他人尝试利用DNN中的交易。