Asp.net mvc 在linqtosql中保存更改之前获取主键(自动递增)
我目前正在使用Asp.net mvc 在linqtosql中保存更改之前获取主键(自动递增),asp.net-mvc,linq,Asp.net Mvc,Linq,我目前正在使用Dbsetlist.Count()获取自动递增表的主键,在执行任何实际保存之前,将在该表中保存一行。。但我觉得这种方法是不正确的,但无法找出任何其他纯粹使用Linq的替代方案。有人能建议如何仅在Linq中实现这一点吗 db.Invoicesets.Add(invoice); //Invoicesets is Invoice table as list for Linq order.invno = db.Invoicesets.Count(); // Invno is needed
Dbsetlist.Count()
获取自动递增表的主键,在执行任何实际保存之前,将在该表中保存一行。。但我觉得这种方法是不正确的,但无法找出任何其他纯粹使用Linq的替代方案。有人能建议如何仅在Linq中实现这一点吗
db.Invoicesets.Add(invoice); //Invoicesets is Invoice table as list for Linq
order.invno = db.Invoicesets.Count(); // Invno is needed as a foreign for Order table
db.Ordersets.Add(order); //
db.SaveChanges();
你在这里要非常小心。如果两个线程同时执行,会发生什么情况:
order.invno = db.Invoicesets.Count();
您将有两个订单具有相同的invno字段,这可能是您不想要的
我猜这个字段应该有一个唯一的约束,并且可能是您的主键?我不认为有任何LINQ唯一的方法可以做到这一点,我认为您需要使invno成为一个标识列,这样您就可以确保它将增加并保持唯一性
编辑
另外,您还可以在应用程序代码中为invno生成GUID,但显然您必须更改数据库中invno字段的数据类型。您的意思是说,您想先添加实体
a
,以便可以使用a,
a.ID
的标识列作为实体B
的FK?如果是,您可以使用:
谢谢你,克里斯。但是如果我
db.SaveChanges()
然后获取invoice.Id
,那么invoice.Id是您的主键吗?它是身份栏吗?我有点不明白你想做什么。如果要递增标识列(如果使用SQL Server),则可以使用SELECT SCOPE_Identity()确定会话中插入表中的最后一个标识值。在这个问题上,你必须与db合作。为什么在保存之前需要主键?谢谢Matt,这正是我要找的。
db.Invoicesets.InsertOnSubmit(invoice);
order.invo = invoice;
db.orders.InsertOnSubmit(order);
db.SubmitChanges();