Transactions 如何在DotNetNuke中使用事务?

Transactions 如何在DotNetNuke中使用事务?,transactions,transactionscope,dotnetnuke,Transactions,Transactionscope,Dotnetnuke,我正在尝试做最简单的事情,并将事务应用于CreatePortal方法 如果我使用的是TransactionScope,由于未知原因,它会升级为DTC-错误 using (var ts = new TransactionScope()) { var portalController = new PortalController(); var portalId = portalController.CreatePortal(

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

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

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


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

我能够在DNN中使用事务,这是在的帮助下实现的


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

您考虑过将事务登录名放入存储过程本身吗?我不认为干预DNN SP是明智之举。我确信还有另一个合法的解决方案。我的主要问题是在单个事务中使用DNN实体和LINQ实体。上面显示的问题只是解决我更大问题的一个障碍。无论如何,为什么DNN 5.X不支持
TransactionScope
@Eran-我认为在dnn第一次构建时,事务范围还没有被考虑到-我个人希望看到dnn支持事务范围,但我认为核心团队将其纳入未来版本是一个人力问题-当然,您可以编写自己的数据提供程序并以这种方式支持它-我们有点他以一种奇怪的方式做了