Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当一列是identity而另一列不是identity时,如何插入具有复杂键的新行?_C#_.net_Entity Framework 6 - Fatal编程技术网

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();
}