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) 声明外键关系?