Frameworks 实体框架4.1代码优先-非主键插入时的自动增量字段

Frameworks 实体框架4.1代码优先-非主键插入时的自动增量字段,frameworks,entity,code-first,auto-increment,Frameworks,Entity,Code First,Auto Increment,我的模型包含订单(父对象)和装运(子对象)。这些数据库表已经有一个代理项作为自动递增主键 我的业务规则是,对于订单中的每个装运,我们都需要有一个自动生成的“计数器”字段——例如装运1、装运2、装运3等。装运模型具有属性:“ShipmentId”、“OrderId”、“ShipmentNumber”。我尝试的实现是将ShipmentNumber设置为int和in代码(与数据库相反),查询装运集合并执行max()+1 这是我正在做的一个代码片段 Shipment newShipmen

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

我的业务规则是,对于订单中的每个装运,我们都需要有一个自动生成的“计数器”字段——例如装运1、装运2、装运3等。装运模型具有属性:“ShipmentId”、“OrderId”、“ShipmentNumber”。我尝试的实现是将ShipmentNumber设置为int和in代码(与数据库相反),查询装运集合并执行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无法查询订单。装运收集。。。但是对于订单,我必须直接在dbcontext之外进行查询,例如

        int? currentMaxId = (_myDbContext)).Orders
                        .Where(x => x.CustomerId == 123456)
                        .Select(x => (int?)x.OrderNumber)
                        .Max();
但是,如果我试图向DbContext添加多个对象而不提交/保存对数据库的更改,则上述部分将无法正常工作。(即,.Where()返回null…并且仅当我使用DbContext“.Local”时才有效,这不是我想要的。)


救命啊!不确定最好的解决方案是什么。谢谢

您似乎已经拥有了增量的shipmentid。您可以将其用于装运编号,也可以将其与此处描述的当前日期结合使用:您试图对Max()执行的操作是邪恶的。远离它,因为当负载较高时,它可能会导致多个装运的装运编号相同的问题