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值。(您可以在事务内部执行此操作,然后回滚事务,甚至在需要时删除记录。)这真的是一个(基于意见的!)设计决策——任何一种方法都可以奏效 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通常不再必要。