我有订单模型。它们都是钥匙,不能复制。我在OrderId
课程中将Identity
设为Map
。
class Order {
public int OrderId {get;set;}
public int OrderNumber {get;set;}
...
}
现在我需要生成新的OrderNumber来插入行。我知道在SQL中我可以包装到事务中并执行MAX(OrderNumber) + 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
对象。