具有相同订单ID的多个记录从之前的MAX值

时间:2017-05-05 16:38:16

标签: c# .net entity-framework linq

很抱歉,如果之前有人询问过。我找不到了。

我有一张表订单,如下所示:

`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值增加? 谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用触发器或存储过程在数据库端编写此类逻辑。

答案 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,例如Entity Framework,您可以将OrderItem作为Collection添加为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...