当一列是标识而另一列不是时,如何插入带有复数键的新行?

时间:2017-01-04 19:06:33

标签: c# .net entity-framework-6

我有订单模型。它们都是钥匙,不能复制。我在OrderId课程中将Identity设为Map

class Order {
    public int OrderId {get;set;}
    public int OrderNumber {get;set;}
    ...    
}

现在我需要生成新的OrderNumber来插入行。我知道在SQL中我可以包装到事务中并执行MAX(OrderNumber) + 1,但我如何在实体框架中执行此操作?

1 个答案:

答案 0 :(得分:1)

您可以将OrderNumber设为标识栏:

class Order
{
    public int OrderId { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int OrderNumber { get; set; }
}

按照惯例,实体框架将认识到OrderId是主键;但是,它不会自动成为标识列,因此您需要将DatabaseGenerated(DatabaseGeneratedOption.Identity)添加到OrderId,以使其自动递增。

但是,如果您不想更改数据库,可以将插入包装在事务中:

using (var transaction = modelContext.BeginTransaction())
{
    var newOrderNumber = modelContext.Orders.Max(o => o.OrderNumber) + 1;
    var newOrder = new Order { OrderNumber = newOrderNumber };
    ...
    transaction.Commit();
}

然后将此值加1分配给新的Order对象。