如何在ServiceStack OrmLite中检索自动递增的Id?

Dyl*_*lan 21 sql-server servicestack ormlite-servicestack

对于具有标识的表:

    [AutoIncrement]
    public int Id { get; set;}
Run Code Online (Sandbox Code Playgroud)

将新行插入数据库时​​,检索对象Id的最佳方法是什么?

例如:

db.Insert <>(new User());

插入后Id的值为0,但在数据库中显然不是这种情况.我能看到的唯一可能性如下:

Id = (int)db.GetLastInsertId();
Run Code Online (Sandbox Code Playgroud)

但是我不相信这是一个安全的号召.如果同时发生100个插入,则可能会返回另一个插入的Id.在EF中进行插入时,将为您设置ID.

有谁知道最好的方法吗?

myt*_*thz 28

在默认使用参数化查询的ServiceStack.OrmLite v4中,有几个选项db.Save()会自动填充AutoIncrement Id,例如:

db.Save(item);
item.Id //populated with the auto-incremented id
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用以下选择最后一个插入ID:

var itemId = db.Insert(item, selectIdentity:true);
Run Code Online (Sandbox Code Playgroud)

以下是展示OrmLite新API的更多示例.


对于OrmLite v3

正确的调用是db.GetLastInsertId()针对SQL Server的调用,例如调用SELECT SCOPE_IDENTITY(),它返回该连接的最后插入的id .

这是安全的,因为可能发生的所有其他并发插入使用不同的DB连接.为了让其他人使用相同的连接,需要将其丢弃并释放回池中.