【问题标题】:How to use transactions in DotNetNuke?如何在 DotNetNuke 中使用事务?
【发布时间】:2009-09-25 17:31:16
【问题描述】:

我正在尝试做最简单的事情并将事务应用于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 中使用事务?

【问题讨论】:

  • 您是否考虑过将事务登录放入存储过程本身?
  • 我不认为干预 DNN SP 是明智之举。我确信还有另一个合法的解决方案。

标签: transactions transactionscope dotnetnuke


【解决方案1】:

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

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

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

【讨论】:

  • 我的主要问题是在单个事务中使用 DNN 实体和我的 LINQ 实体。上面显示的问题只是解决我更大问题的障碍。
  • 反正DNN 5.X怎么不支持TransactionScope?!
  • @Eran - 我认为在第一次构建 dnn 时还没有考虑到事务范围 - 我希望看到 DNN 支持事务范围,但我认为这是人力方面的问题核心团队将其纳入未来版本 - 当然,您始终可以编写自己的数据提供程序并以这种方式支持它 - 我们以一种奇怪的方式做到了
【解决方案2】:

this article 的帮助下,我能够在 DNN 中使用事务。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多