How to retrieve auto-incremented Id in ServiceStack OrmLite?

别等时光非礼了梦想. 提交于 2019-11-30 06:41:29

In ServiceStack.OrmLite v4 which defaults to using parameterized queries there are a couple of options in db.Save() which automatically populates the AutoIncrement Id, e.g:

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

Otherwise you can select the last insert id using:

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

Here are more examples showcasing OrmLite's new API's.


For OrmLite v3

The correct call is db.GetLastInsertId() which for SQL Server under the hood for example calls SELECT SCOPE_IDENTITY() which returns the last inserted id for that connection.

This is safe because all the other concurrent inserts that might be happening are using different DB connections. In order for anyone else to use the same connection it needs to be disposed of and released back into the pool.

You should definitely using the Unit of Work pattern, particularly in this scenarios, you wrap the db related codes in a transaction scope.

In ormLite, you can implement this via IDbCommand and IDbTransaction (see example here http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs)

Looking at the code, you'll notice it's going to be less magical and more manual coding, but it's one way.

Update: As seen here, if you are using ServiceStack/ORMLite v4, you need to utilize the parameterized query to get the inserted ID. For example:

var UserId = db.Insert<User>(new User(), selectIdentity: true);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!