对于有身份的表:
[AutoIncrement]
public int Id { get; set;}
当插入新行到数据库中,什么是检索对象的ID的最佳方式?
例如:
db.Insert <>(新用户());
该ID的值插入后为0,但在数据库中这显然并非如此。 我能看到的唯一的可能性是以下几点:
Id = (int)db.GetLastInsertId();
但是我不相信这将是一个安全的征召令。 如果有插入在同一时间发生的100的,可能会返回另一个插入的ID。 在EF当你做ID设置为你的插件。
有谁知道去了解这一点的最好方法是什么?
在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为连接 。
因为所有可能发生的其他并发插入使用不同的数据库连接是安全的。 为了让其他人使用它需要处置和释放回池中相同的连接。
你一定要使用工作单元模式,尤其是在这个情况下,你包在一个事务范围的数据库相关的代码。
在ormLite,您可以通过IDbCommand的和IDbTransaction实现这个(见这里例如http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs )
看代码,你会发现这将是不可思议的少,更手动编码,但它是一种方式。
更新:由于看到这里 ,如果你正在使用ServiceStack / ORMLite V4,你需要利用参数化查询来获取插入的ID。 例如:
var UserId = db.Insert<User>(new User(), selectIdentity: true);