2014-01-06 44 views
3

當使用OrmLite增加似乎有這樣做的兩種方式的進入數據庫:OrmLite更新()與保存()

dbConn.Insert(customer); 

dbConn.Save(customer); 

當使用插入( )AutoIncrement ID字段沒有得到更新,但是當使用Save()時,它確實如此。

如果你使用:

dbConn.LastInsertId(); 

它將返回正確的ID,如果使用保存(),但錯誤的ID,如果使用插入()。

爲什麼這兩種方法存在?使用Insert()會使用正確的ID向數據庫添加一個條目,但它並未反映在POCO模型中。看起來奇怪的是,沒有拋出異常並且沒有任何問題跡象,如果您不知道這一點,最終可能會使用錯誤的ID並難以跟蹤錯誤。

+0

已將[AutoIncrement]添加到您的POCO中? – reptildarat

+0

是的我在ID字段有[AutoIncrement]屬性。 – Dru

回答

7

它在單證已經提到:

保存白水如果與標識不存在的記錄將插入,否則更新。兩者都採用多個項目,優化後執行單個讀取以檢查現有記錄並在單筆交易中執行。

對於插入操作,它很直接,沒有什麼特別的功能。

所以,使用插入當你知道有沒有重複鍵在你的記錄,否則使用保存方法。

如果您想通過Insert方法檢索LastInsertId,則需要在POCO上指定[AutoIncrement]。

UPDATE:當您設置使用Singelton您IDbConnectionFactory隨着懶< T>實施,似乎LastInsertId將無法正常工作。所以只需使用鎖定或靜態實現。

+0

這是奇怪的,當我用[AutoIncrement]屬性使用Insert()時,LastInsertId返回零。我應該始終使用Save()?我希望ORM爲我完全處理ID。但是如果其他人開始使用代碼並開始使用Insert(),然後弄錯了錯誤的記錄,那麼會發生什麼呢?因爲他們在使用Insert()時返回了錯誤的ID。 – Dru

+0

請分享您如何使用GetLastInsertId語句。 – reptildarat

+0

嘗試更新兩種方式: dbConn.Insert(customer,selectIdentity:true); dbConn.Insert(customer); 然後使用: var customerId2 = dbConn.LastInsertId(); 我使用的是OrmLite的V4,因此GetLastInsertId似乎不再存在。 – Dru