2017-05-05 60 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

相关问题