2016-05-16 49 views
0

我的MVC模式將是這個樣子:在ASP .NET MVC自動創建採購訂單數量

public DateTime entry_dts {get;set;} 
public string po_number {get;set;} 

的PO_NUMBER場將被系統(最後訂單號+1)自動生成。

如何確保創建控制器在創建新條目時自動計算po_number?

回答

1

由於PO是理想的唯一標識符,因此也可以將其用作主鍵。在這種情況下,您可以簡單地依靠此標識列的自動遞增本質。

如果您不能或不會將它作爲主鍵,那麼事情會變得更棘手,因爲您必須處理併發問題。也就是說,您需要從數據庫中查詢最大采購訂單編號,然後將其增加,然後保存您的記錄。但是,與此同時,另一條記錄可能已經保存,所以您必須對此進行說明。爲了讓您的生活更輕鬆,您應該確保PO列被設置爲唯一。這樣,如果同一份採購訂單試圖多次使用,您將收到一個可以捕獲的完整性錯誤。然後,它只是一個做類似的事情:

var lastPO = db.Invoices.OrderByDescending(o => o.po_number).Select(m => m.po_number).FirstOrDefault() ?? [starting PO number]; 
invoice.po_number = lastPO++; 

[starting PO number]將是沒有發票已經被創建的情況下將發行第一PO號。

然後,保存時,您需要捕獲可能的完整性錯誤並作出相應的響應。我的大腦對你應該捕獲的確切異常有點模糊,而且似乎處理獨特約束違規的文檔相當稀少。每個人都想談談更新併發性,這與此不一樣。但是,這很容易弄清楚。只需運行代碼並嘗試保存重複的採購訂單。你得到的例外是你應該抓住的例外。然後,在您的catch塊中,您只需增加採購訂單編號並嘗試再次保存。

顯然,這是一個無限循環(儘管如此,我認爲,實際上很少有PO號碼產生得如此之快,以致於至少在第二次嘗試中無法獲得,我建議使用類似Polly的東西來簡化事情,Polly允許您設置異常處理策略,使您可以無限次地執行重試,直到最終成功,重試,然後等待一段時間再重試,甚至斷路器,全部用最小的努力。