2013-07-18 44 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。 –