Entity Framework 4.1 Code First - 插入非主键时自动递增字段

Posted

技术标签:

【中文标题】Entity Framework 4.1 Code First - 插入非主键时自动递增字段【英文标题】:Entity Framework 4.1 Code First - auto increment field on insert for non primary key 【发布时间】:2011-09-28 22:50:28 【问题描述】:

我的模型包含一个 Order(父对象)和 Shipments(子对象)。这些数据库表已经有一个代理键作为自动增量主键。

我的业务规则是,对于订单中的每批货物,我们需要有一个自动生成的“柜台”字段——例如Shipment 1、Shipment 2、Shipment 3 等。Shipment 模型具有属性:“ShipmentId”、“OrderId”、“ShipmentNumber”。我尝试的实现是将 ShipmentNumber 设置为 int 并在代码中(而不是数据库),查询 Shipment 集合并执行 max() + 1。

这是我正在做的代码片段。

        Shipment newShipmentObj = // blah;

        int? currentMaxId = myOrderObj.Shipments
                            .Select(x => (int?) x.ShipmentNumber)
                            .Max();
            if (currentMaxId.HasValue)
                newShipmentObj.ShipmentNumber = currentMaxId.Value + 1;
            else
                newShipmentObj.ShipmentNumber = 1; // 1st one

        myOrderObj.Shipments.Add(newShipmentObj);

        // etc.. rest of EF4 code

有没有更好的方法?

我不太喜欢这样,因为由于潜在的事务/并发问题,我遇到了以下问题。

我的订单对象也有一个自动增量“计数器”——例如Order 1, Order 2, Order 3, ... 我的 Order 模型具有属性:“OrderId”、“CustomerId”、“OrderNumber”。

我的设计是我有一个 OrderRepository,但没有一个 ShipmentRepository。 ShipmentRepository 可以查询 Order.Shipment 集合...但是对于 Orders,我必须直接从 dbcontext 查询,例如

        int? currentMaxId = (_myDbContext)).Orders
                        .Where(x => x.CustomerId == 123456)
                        .Select(x => (int?)x.OrderNumber)
                        .Max();

但是,如果我尝试将多个对象添加到 DbContext 而不提交/保存对数据库的更改,则上述部分效果不佳。 (即 .Where() 返回 null ...并且仅在我使用 DbContext“.Local”时才有效,这不是我想要的。)

帮助!不确定最好的解决方案是什么。谢谢!

【问题讨论】:

【参考方案1】:

您似乎已经有了增量的 shippingid。您可以将它用于您的发货编号,也可以与此处描述的当前日期结合使用:How to implement gapless, user-friendly IDs in NHibernate? 您尝试对 Max() 执行的操作是邪恶的。远离它,因为当负载很高时,它可能会导致多个货件获取相同货件编号的问题

【讨论】:

以上是关于Entity Framework 4.1 Code First - 插入非主键时自动递增字段的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 4.1Code First 连接到 Sql Server 2005

Entity Framework 4.1 Code First 关系中的更改通常不需要

Entity Framework 4.1 Code First - 插入非主键时自动递增字段

我应该如何在 MVC3 中使用 Code First Entity Framework (4.1) 声明外键关系?

virtual 关键字在 Entity Framework 4.1 POCO Code First 中可以产生啥影响?

Entity Framework 4.1 Code First,一对一,一个表连接到复合键的单个键字段