2017-05-05 57 views
1

對不起,如果這是之前問過。我找不到它。具有相同訂單ID的多個記錄從前一個MAX值遞增

我有一個表訂單這樣的:

`id | orderId | productId` 

訂單可能有多個產品,但他們都應該有相同的訂單ID。 在我的代碼中: int nextOrder=db.Orders.Max(m=>m.orderId)+1;//???!!!! foreach(var p in productList) { var o=new Order(); o.orderId=nextOrder;//??????????????????? o.productId=p.productId; db.Orders.Add(o); } db.SaveChanges(); 但是,這不是線程安全的 - 當我處理一個訂單時,另一個線程可能會得到相同的訂單ID。我該如何解決這個問題,以插入多個記錄,其中相同的訂單ID從前一個MAX值增加? 謝謝!

+0

您應該將產品添加到集合'order.Products'中,EF將完成其餘工作。 (因爲訂單有一個自動增量列,如下所述)。 –

+0

@Gert Arnold我希望避免創建另一個表**訂單**,因爲我沒有與整個訂單相關的屬性。 – shlasasha

+0

那麼它有什麼用處呢?這只不過是一個與無關的增值Id值。通常情況下,這個模型將由三個表格組成,Order,Product和連接表都以多對多關係連接(表格)。 –

回答

1

您可以使用觸發器或存儲過程在數據庫端編寫這樣的邏輯。

0

SQL Server有一個IDENTIITY列函數可用,MS Access和MySql有類似的已知AUTO_INCREMENT。像這樣的東西可以在你的訂單表上實現;當你插入一條新記錄時它會自動填充,你可以調用另一個SQL命令來檢索該值。

這樣做的SQL Server版本將是這種格式

INSERT Orders (columns) VALUES (new values); SELECT Scope_Identity();

MySQL和MS Access和其他RDBMS將有類似的命令也是如此。

更新

許多電子商務平臺將有訂單和項目中至少2個單獨的表,通常訂貨會的訂單信息和OrderItem的將是一個訂單中的項目。通常情況下,由於價格變化等原因,您希望OrderItem表中的產品的更多信息,這些信息不應追溯更改過去您在未來更新(或刪除)產品時的訂單。以準代碼形式對數據庫進行粗略概述。如果您正在使用和ORM(如實體框架),則可以將OrderItem作爲集合添加爲Order類的屬性。

Order 
    OrderID  Int  AutoIncrement Primary Key 
    OrderDate  DateTime 
    OrderSubtotal Decimal 
    ...etc... 

OrderItem 
    ItemID   Int  AutoIncrement 
    OrderID  Int  Indexed, FK relationship to Order.OrderID 
    ProductID  Int 
    ProductPrice Decimal 
    Qty   Int 
    ...etc... 
+0

我使用自動增量ID列,但對於訂單ID我需要插入多個記錄具有相同的OrderId值 – shlasasha

+1

訂單中包含的項目應該在一個單獨的表中,我們將其稱爲OrderItems。我會更新答案,以顯示它應該如何看待的想法 –

+0

是的,我想到了。我希望避免創建另一個表,因爲我沒有與整個訂單相關的屬性。但是,謝謝你的回答 – shlasasha

相關問題