2017-08-24 115 views
2

我的Orchard應用程序中有一個採購訂單內容類型。其他屬性中包含PurchaseOrderNumber。採購訂單號是在用戶首次保存採購訂單時分配的。我使用自定義控制器和視圖來執行採購訂單CRUD操作。如何閱讀將單獨的數據庫事務中的內容項目寫入請求

我有一個採購訂單編號定義部分,它附加到公司內容類型,其中保存了下一個採購訂單編號,前綴和填充。因此,當系統產生下一個採購訂單號時,前綴(例如PO)與下一個號碼(例如123)和填充(例如5)一起使用以產生一個字符串 - 例如, PO00123。

當生成採購訂單編號時,附加到公司內容項目的採購訂單定義部分中存儲的下一個採購訂單編號被增加並保存,以便當用戶創建另一個採購訂單時,將爲其分配下一個編號。

我的挑戰在於,如果兩個用戶同時創建新的採購訂單,可以防止分配重複的採購訂單號。

我正在考慮創建一個使用lock(_lock){...}來生成下一個數字的代碼的ISingletonDependency。通過這種方式,多個請求可以請求下一個號碼並始終獲得下一個唯一號碼。我如何實現這個呢?我無法弄清楚如何訪問具有自己的數據庫事務的IContentManager。

或者是否有不同的模式,我應該使用?

+0

爲什麼要在訂單創建之前擁有訂單號**?爲什麼不在創建訂單時分配號碼,然後將其顯示給用戶?這樣你永遠不會有重複 – devqon

+0

該號碼只在用戶創建訂單時分配。問題是,如果兩個用戶點擊約保存按鈕。每個用戶最終可能會得到相同的採購訂單號。 –

回答

2

查看Orchard.Tasks.Locking.Services.DistributedLockService類後,我想出了它。您需要依賴ILifetimeScope,然後解析ITransactionManager和IContentManager。

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 ""; 
    } 
    } 
} 
相關問題