如何检索自动递增的标识在ServiceStack OrmLite?(How to retrieve

2019-08-06 17:14发布

对于有身份的表:

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

当插入新行到数据库中,什么是检索对象的ID的最佳方式?

例如:

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

该ID的值插入后为0,但在数据库中这显然并非如此。 我能看到的唯一的可能性是以下几点:

Id = (int)db.GetLastInsertId();

但是我不相信这将是一个安全的征召令。 如果有插入在同一时间发生的100的,可能会返回另一个插入的ID。 在EF当你做ID设置为你的插件。

有谁知道去了解这一点的最好方法是什么?

Answer 1:

ServiceStack.OrmLite V4默认为使用参数化查询中有几个选项db.Save()其自动填充自动递增编号,例如:

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

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

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

下面是更多的例子展示OrmLite的新的API 。


对于OrmLite V3

正确的调用是db.GetLastInsertId()其引擎罩例如在SQL Server调用SELECT SCOPE_IDENTITY()返回最后插入的ID为连接

因为所有可能发生的其他并发插入使用不同的数据库连接是安全的。 为了让其他人使用它需要处置和释放回池中相同的连接。



Answer 2:

你一定要使用工作单元模式,尤其是在这个情况下,你包在一个事务范围的数据库相关的代码。

在ormLite,您可以通过IDbCommand的和IDbTransaction实现这个(见这里例如http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs )

看代码,你会发现这将是不可思议的少,更手动编码,但它是一种方式。



Answer 3:

更新:由于看到这里 ,如果你正在使用ServiceStack / ORMLite V4,你需要利用参数化查询来获取插入的ID。 例如:

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


文章来源: How to retrieve auto-incremented Id in ServiceStack OrmLite?