首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将单独数据库事务中的内容项读取到请求的内容项?

如何将单独数据库事务中的内容项读取到请求的内容项?
EN

Stack Overflow用户
提问于 2017-08-24 14:34:24
回答 1查看 53关注 0票数 2

我的果园应用程序中有一个购买订单内容类型。除其他属性外,它还有一个PurchaseOrderNumber。当用户第一次保存采购订单时,指定采购订单号。我使用自定义控制器和视图来实现购买订单CRUD操作。

我有一个采购订单号码定义部分,它附加到一个公司内容类型,其中保存下一个采购订单号,一个前缀和填充。因此,当系统生成下一个采购订单号时,前缀(例如PO)与下一个号码(例如123)和填充(例如5)一起用于生成字符串,例如PO00123。

当生成采购订单号码时,存储在附加到公司内容项的采购订单定义部分中的下一个采购订单编号被递增和保存,以便当用户创建另一个采购订单时,将分配下一个号码。

我在这里的挑战是,如果两个用户同时创建一个新的采购订单,则无法分配重复的采购订单号。

我正在考虑创建一个ISingletonDependency,它使用锁(_lock) {.}来包装将生成下一个数字的代码。这样,多个请求就可以请求下一个号码,并且总是得到下一个唯一的号码。不过,我如何实现这一点呢?我不知道如何访问拥有自己数据库事务的IContentManager。

还是有不同的模式,我宁愿使用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-25 03:21:00

我是在看了Orchard.Tasks.Locking.Services.DistributedLockService类之后才弄明白的。您需要接受对ILifetimeScope的依赖,然后解析ITransactionManager和IContentManager。

代码语言:javascript
复制
lock (_lock) {
  using (var childLifetimeScope = _lifetimeScope.BeginLifetimeScope()) {
    var transactionManager = childLifetimeScope.Resolve<ITransactionManager>();
    var contentManager = childLifetimeScope.Resolve<IContentManager>();
    try {
      transactionManager.RequireNew(IsolationLevel.Serializable);
      var contentItem = contentManager.GetLatest(contentItemId);

      var number = CompileNewNumber(contentItem);

      contentManager.Publish(contentItem);
      return number;
    }
    catch (Exception exception) {
      Logger.Error(exception, "Error compiling next number.");
      transactionManager.Cancel();
      return "";
    }
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45864391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档