Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Asp.net mvc 在linqtosql中保存更改之前获取主键(自动递增)_Asp.net Mvc_Linq - Fatal编程技术网

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