2013-01-13 37 views
19

對於有身份的表:如何在ServiceStack OrmLite中檢索自動遞增的ID?

[AutoIncrement] 
    public int Id { get; set;} 

當插入新行到數據庫中,什麼是檢索對象的ID的最佳方式?

例如:

db.Insert <>(新用戶());

插入後Id的值爲0,但在數據庫中顯然不是這種情況。我可以看到的唯一可能性如下:

Id = (int)db.GetLastInsertId(); 

但是,我不認爲這將是一個安全的電話。如果有100個插入同時發生,則可能會返回另一個插入的ID。在EF中,當你做一個插入的時候,Id就是爲你設置的。

有沒有人知道最好的方式去做這件事?

回答

26

ServiceStack.OrmLite V4默認爲使用參數化查詢有在db.Save()幾個選項,這些選項會自動填充自動遞增編號,如:

db.Save(item); 
item.Id //populated with the auto-incremented id 

否則,您可以使用選擇最後一個插入ID :

var itemId = db.Insert(item, selectIdentity:true); 

這裏是more examples showcasing OrmLite's new API's


對於OrmLite V3

正確的調用是db.GetLastInsertId()這對於罩例如在SQL Server調用SELECT SCOPE_IDENTITY()返回爲連接最後插入的ID。

這是安全的,因爲所有其他可能發生的併發插入使用不同的數據庫連接。爲了讓其他人使用相同的連接,它需要被處理並釋放回池中。

+0

哦,這是每個連接!現在,這更有意義。 – Dylan

+0

感謝您對v3的澄清! db.GetLastInsertId()似乎不工作,因爲它是一種隱藏的方法,我認爲....任何指針? – theoutlander

2

您應該明確使用工作單元模式,特別是在這種情況下,將數據庫相關代碼包裝在事務範圍中。

在ormLite,您可以通過IDbCommand的和IDbTransaction實現這個(見這裏http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs例子)

看代碼,你會發現它的將是更小的神奇和更多的手動編碼,但它是一種方式。

+0

將閱讀有關Unit of Work的內容並查看示例源代碼。 – Dylan

2

更新:如圖所示here,如果您使用的是ServiceStack/ORMLite v4,則需要使用參數化查詢來獲取插入的ID。例如:

var UserId = db.Insert<User>(new User(), selectIdentity: true);