2013-07-18 42 views
0

我目前使用的是Dbsetlist.Count()来获取Autoincremented表的主键,在执行任何实际保存之前将保存一行。但我觉得这种方法是不正确,但不能找出任何纯粹使用Linq的其他选择可以有人建议如何在Linq中做到这一点?在保存更改之前自动增量的主键在linqtosql

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

为什么在保存前需要主键? –

回答

1

您的意思是说,您希望首先添加实体A,以便您可以使用A,A.ID的标识列作为实体B的FK?如果是,您可以使用InsertOnSubmit()

db.Invoicesets.InsertOnSubmit(invoice); 
order.invo = invoice; 
db.orders.InsertOnSubmit(order); 
db.SubmitChanges(); 
+1

感谢马特,这正是我一直在寻找的。 –

1

你想在这里非常小心。如果两个线程,在同一时间,执行会发生什么:

order.invno = db.Invoicesets.Count(); 

您将有两个命令与同invno领域,这可能是你不想要的东西。

我猜测字段应该有一个唯一的约束,也许你的主键?我不认为有任何LINQ的唯一方法可以做到这一点,我认为你需要创建一个标识列,这样你会放心,它会增加和保持独特。

编辑

顺便说一句,你还可以生成一个GUID在应用程序代码invno,但很明显,你必须改变invno字段的数据类型在你的数据库。

+0

谢谢克里斯。但是,如果我'db.SaveChanges()'然后得到'invoice.Id',会不会是一个问题? –

+0

因此Invoice.Id是您的主键?它是一个身份专栏吗?我对你想要做什么感到困惑。如果正在增加Identity列(如果您使用的是SQL Server),则可以使用SELECT SCOPE_IDENTITY()来确定会话中表中插入的最后一个标识值。你必须在这上面使用db。 –