我正在尝试做最简单的事情并将事务应用于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中使用交易?
答案 0 :(得分:1)
当您通过GetTransaction
方法创建交易时,DataProvider
只会创建一个新连接并为您提供交易。然后,您需要手动使用该事务来执行您将对数据库采取的任何操作。没有办法传递该事务,以便它被例如CreatePortal
或任何其他内置DNN函数使用。该功能似乎只适用于您可能进行的任何其他数据库访问。
关于如何在事务中包装来自DNN核心的呼叫,我认为你不能。我知道推荐的最干净的解决方案(不幸的是,它仍然不是很干净)是使用事务手动调用存储过程,而不是通过控制器类。
你的用例是什么,也许我可以推荐一种解决问题的解决方案......
答案 1 :(得分:1)
我可以在this article的帮助下使用DNN中的交易。
它不适用于您的情况,但会帮助其他人尝试利用DNN中的交易。