我的模型包含一个订单(父对象)和发货(子对象)。这些数据库表已经有一个代理键作为自动增量主键。
我的业务规则是,对于订单中的每个发货,我们需要有一个自动生成的“计数器”字段--例如发货1、发货2、发货3等。发货模型具有属性:"ShipmentId“、"OrderId”、"ShipmentNumber“。我尝试的实现是让ShipmentNumber使用int和代码(与数据库相对),查询发货集合并执行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对象也有一个自动递增的“计数器”--例如Order 1,Order 2,Order 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“时才有效,而这不是我想要的。)
帮助!不确定最好的解决方案是什么。谢谢!
发布于 2011-11-25 05:12:22
您似乎已经拥有了递增的shipmentid。您可以将它用于您的发货号,也可以将其与当前日期结合使用,如下所示:How to implement gapless, user-friendly IDs in NHibernate?您试图使用Max()做的事情是邪恶的。远离它,因为当负载很高时,它可能会导致在多次发货时获得相同的发货号的问题
https://stackoverflow.com/questions/6585455
复制相似问题