gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:53:04 25 4
gpt4 key购买 nike

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

我的业务规则是,对于订单中的每批 cargo ,我们都需要有一个自动生成的“计数器”字段——例如货件 1、货件 2、货件 3 等。货件模型具有属性:“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

有没有更好的方法?

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

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

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

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

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

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

最佳答案

您似乎已经有了递增的 shipmentid。您可以将它用于您的装运编号,也可以按照此处所述与当前日期结合使用:How to implement gapless, user-friendly IDs in NHibernate?你试图用 Max() 做什么是邪恶的。远离它,因为当负载很高时,它可能会导致多次发货获得相同的发货编号的问题

关于frameworks - Entity Framework 4.1 Code First - 插入非主键时自动递增字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6585455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com