Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# 如何获取要在DBC上下文中创建的下一个实体的主键(id)#_C#_.net_Entity Framework_Ef Code First_Dbcontext - Fatal编程技术网

C# 如何获取要在DBC上下文中创建的下一个实体的主键(id)#

C# 如何获取要在DBC上下文中创建的下一个实体的主键(id)#,c#,.net,entity-framework,ef-code-first,dbcontext,C#,.net,Entity Framework,Ef Code First,Dbcontext,是否可以获取下一步要创建的实体的主键的值?在它被创建之前 我试过: Order newOrder = new Order(); MessageBox.Show(newOrder.orderId.toString()); 它显示为0 可能吗 大图: 我正在尝试建立一个快餐订单管理系统。我有订单,项目和订单项目表格。在订单和项目之间存在多对多关系,订单项目表解决了这种关系 因此,在添加订单时,我需要添加OrderItems,其orderId字段应该由刚刚创建的“订单”填充,即尚未创建 编辑:我使用

是否可以获取下一步要创建的实体的主键的值?在它被创建之前

我试过:

Order newOrder = new Order();
MessageBox.Show(newOrder.orderId.toString());
它显示为0

可能吗

大图:

我正在尝试建立一个快餐订单管理系统。我有
订单
项目
订单项目
表格。在
订单
项目
之间存在多对多关系,
订单项目
表解决了这种关系

因此,在添加订单时,我需要添加
OrderItem
s,其
orderId
字段应该由刚刚创建的“订单”填充,即尚未创建


编辑:我使用代码优先的方法。

如果密钥是在数据库中生成的,则不可能。因此,我看到了两种选择:

  • 您只需将实体添加到集合中,然后调用
    dbContext.SaveChanges()
    将其写入数据库并在代码中使用id值。(您可以在事务内部执行此操作,然后回滚事务,甚至在需要时删除记录。)
  • 您可以在代码中自己生成id值,而不是由数据库生成某些内容—可能是使用GUID作为id
  • 每种方法都有积极的一面和消极的一面,这取决于它如何适合你的“大局”

    更新:

    从正面和负面来看,第一种选择可能更接近你最初的计划。可以让它工作。可以说,这将使与其他实体建立关系变得更容易。另一方面,每次你想获得一个新的id时,你都需要点击数据库,这可能会慢一些


    这真的是一个(基于意见的!)设计决策——任何一种方法都可以奏效

    EF会处理好的

    因此,如果先编写代码,可以执行以下操作:

    class Order
    {
       [Key]
       public int Id { get; set }
    
       public virtual List<OrderItem> Items { get; set; }
    
       public Order()
       {
         Items = new List<OrderItem>();
       }
    }
    
    class OrderItem
    {
       [Key]
       public int Id { get; set; }
    
       public string ItemName { get; set; } //of course just a demo property
    }
    
    Order order = new Order()
    
    OrderItem item = new OrderItem();
    item.ItemName = "Super Burger";
    
    order.Items.Add( item );
    
    context.Orders.Add( order );
    context.SaveChanges();
    

    一切正常,密钥也相应地填充。

    我想您会发现带有回滚的选项1不起作用。我承认,在建议回滚时,我应该建议在事务中这样做。我认为我的回答仍然是合理的。编辑以澄清now@Stewart_R,我试图在我的问题中解释更大的图景。请查看我的更新即使在事务中它也不会工作。如果添加id 5,然后将其回滚,则下一个要添加的id仍然是6。试试看。@DavidG是的,当然。但他仍然可以在代码中使用值5来确定是否需要回滚。下次使用新id本身没有问题吗?如果它是数据库分配的,那么就没有问题了,在插入之前,您无法知道该id是什么。对于您的特定问题,我认为没有必要知道id,您应该只知道模型之间的关系,并让EF处理两者之间的映射。当然-但此时EF将在数据库中创建记录。OP询问在创建之前是否可以检索到
    orderID
    ,Di考虑到了他的“大局”——根据我的方法,知道Id通常不再必要。