【发布时间】: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”时才有效,这不是我想要的。)
帮助!不确定最好的解决方案是什么。谢谢!
【问题讨论】:
标签: frameworks entity code-first auto-increment