【问题标题】:multiple records with the same order id incremented from the previous MAX value具有相同订单 ID 的多条记录从前一个 MAX 值递增
【发布时间】:2017-05-05 16:38:15
【问题描述】:

抱歉,如果之前有人问过这个问题。没找到。

我有一张这样的Orders表:

`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 的记录,该订单 ID 从上一个 MAX 值递增? 谢谢!

【问题讨论】:

  • 您应该将产品添加到集合order.Products,然后 EF 将完成剩下的工作。 (因为 Order 有一个自动增量列,如下所述)。
  • @Gert Arnold 我希望避免创建另一个表 order,因为我没有与整个订单相关的属性。
  • 那么它有什么用呢?它只不过是一个与任何无关的递增的 Id 值。通常,此模型由三个表组成,OrderProduct 和一个以多对多关系连接两者的联结表(您的表)。
  • @Gert Arnold 我的例子只是一个例子。我拥有的是一组项目,我想将其保留为 'row_id |收藏ID | item_data' 在一个表中。
  • 你和 Mad Myche 似乎在说我需要两张表 CollectionsCollectionItems

标签: c# .net entity-framework linq


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    SQL Server 有一个可用的IDENTIITY 列函数,MS Access 和 MySql 有类似的AUTO_INCREMENT。可以在您的订单表上实施这样的事情;它会在您插入新记录时自动填充,您可以调用另一个 SQL 命令来检索该值。

    Sql Server 版本将采用这种格式

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

    MySql、MS Access 和其他 RDBMS 也会有类似的命令。

    更新

    许多商务平台会将 Orders 和 Items 放在至少 2 个单独的表中,通常 Order 是订单信息,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...
    

    【讨论】:

    • 我对 ID 列使用 Auto Increment,但对于 Order Id,我需要插入几条具有相同 OrderId 值的记录
    • 订单中包含的项目应该在一个单独的表中,我们称之为OrderItems。我将更新答案以展示它的外观
    • 是的,我想到了。我希望避免创建另一个表,因为我没有与整个订单相关的属性。不过谢谢你的回答
    • 想想商店的收据,顶部和底部都有日期、总额、税金等,里面装满了购买的物品。我很乐意提供帮助
    • 感谢您的详细解释。我的例子可能有点误导。我拥有的是一组项目,我想将其保留为 'row_id |收藏ID | item_data' 在单个表中。我可以通过对 collectionId (OrderId) 使用 GUID 来实现它,但我听说这不是一个好主意......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2017-05-05
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多