C# 当一列是identity而另一列不是identity时,如何插入具有复杂键的新行?
我有一个订单模型。它们都是密钥,不能复制。我在C# 当一列是identity而另一列不是identity时,如何插入具有复杂键的新行?,c#,.net,entity-framework-6,C#,.net,Entity Framework 6,我有一个订单模型。它们都是密钥,不能复制。我在Map类中将OrderId设置为Identity。 现在我需要生成新的OrderNumber来插入行。我知道在SQL中,我可以包装到事务中并执行MAX(OrderNumber)+1,但如何在实体框架中执行此操作?您可以将OrderNumber设置为标识列: class Order { public int OrderId { get; set; } [DatabaseGenerated(DatabaseGeneratedOption
Map
类中将OrderId
设置为Identity
。
现在我需要生成新的OrderNumber来插入行。我知道在SQL中,我可以包装到事务中并执行
MAX(OrderNumber)+1
,但如何在实体框架中执行此操作?您可以将OrderNumber
设置为标识列:
class Order
{
public int OrderId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int OrderNumber { get; set; }
}
按照惯例,实体框架将认识到OrderId是主键;但是,它不会自动成为标识列,因此您需要将DatabaseGeneratedOption(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分配给新的
订单
对象。为什么,这有什么作用?为什么不改为使用OrderId
?@Igor我想按OrderNumber
对订单进行分组,并希望避免创建不同订单时可能出现重复。1。您在上文中指出,订单号是唯一的,因此您不能根据上述解释按订单号对订单进行分组。2.使用标识可以保证该表中的唯一性,因此我认为使用OrderNumber没有任何用处。你在解释中遗漏了什么吗?你是说IsolationLevel.Serializable就足够了?谢谢!能否将maxOrderNumber
修改为maxOrderNumber+1
,以便我可以批准它?当然可以。批准了。
using (var transaction = modelContext.BeginTransaction())
{
var newOrderNumber = modelContext.Orders.Max(o => o.OrderNumber) + 1;
var newOrder = new Order { OrderNumber = newOrderNumber };
...
transaction.Commit();
}