首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Entity Framework 4.1 Code First -插入时为非主键自动递增字段

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

Stack Overflow用户
提问于 2011-07-05 23:50:06
回答 1查看 2.1K关注 0票数 3

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

我的业务规则是,对于订单中的每个发货,我们需要有一个自动生成的“计数器”字段--例如发货1、发货2、发货3等。发货模型具有属性:"ShipmentId“、"OrderId”、"ShipmentNumber“。我尝试的实现是让ShipmentNumber使用int和代码(与数据库相对),查询发货集合并执行max() + 1。

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

代码语言:javascript
运行
复制
        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中查询,例如

代码语言:javascript
运行
复制
        int? currentMaxId = (_myDbContext)).Orders
                        .Where(x => x.CustomerId == 123456)
                        .Select(x => (int?)x.OrderNumber)
                        .Max();

但是,如果我试图将多个对象添加到DbContext,而没有提交/保存对数据库的更改,那么上面的部分就不能很好地工作。(即.Where()返回null...并且仅当我使用DbContext ".Local“时才有效,而这不是我想要的。)

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

EN

回答 1

Stack Overflow用户

发布于 2011-11-25 05:12:22

您似乎已经拥有了递增的shipmentid。您可以将它用于您的发货号,也可以将其与当前日期结合使用,如下所示:How to implement gapless, user-friendly IDs in NHibernate?您试图使用Max()做的事情是邪恶的。远离它,因为当负载很高时,它可能会导致在多次发货时获得相同的发货号的问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6585455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档