为了举例说明这个问题,我有一个简单的表,其中PK是AUTOINCREMENT。当我使用Insert时,GetLastInsertId正常工作,即返回插入行的键值,但不是当我使用InsertParam时。然后键值为0.当我查看数据库时,一切看起来都不错。
我安装的版本是https://www.nuget.org/packages/ServiceStack.OrmLite.SqlServer/3.9.56。
示例代码
public class Foo
{
public Foo() {}
[AutoIncrement]
public int Id { get; set; }
public string SomeText { get; set; }
}
插入 - GetLastInsertId正常工作
using (IDbConnection db = dbFactory.OpenDbConnection())
{
db.Insert(new Foo { SomeText = "Bla bla" } );
string sql = db.GetLastSql();
// sql = "INSERT INTO \"Foo\" (\"SomeText\") VALUES (N'Bla bla')"
int id = (int)db.GetLastInsertId();
// id = 1
sql = db.GetLastSql();
// sql = SELECT SCOPE_IDENTITY()
}
InsertParam - GetLastInsertId无效(始终为0 !!!)
using (IDbConnection db = dbFactory.OpenDbConnection())
{
db.InsertParam(new Foo { SomeText = "Bla bla" } );
string sql = db.GetLastSql();
// sql = "INSERT INTO \"Foo\" (\"SomeText\") VALUES (@SomeText)"
int id = (int)db.GetLastInsertId();
// id = 0 (always 0)
sql = db.GetLastSql();
// sql = "SELECT SCOPE_IDENTITY()"
}
还有其他人在ORMLite和SQL Server上遇到过同样的问题吗?
当我查看ORMLite和SQL服务器的源代码并且项目ServiceStack.OrmLite.SqlServerTests时,我看到了带有测试用例Can_GetLastInsertedId_using_InsertParam的类InsertParam_GetLastInsertId。应该给出一个断言,我想?
我刚刚通过运行NUnit来验证错误,我在第31行得到了预期的错误
ServiceStack.OrmLite.SqlServerTests.
InsertParam_GetLastInsertId.
Can_GetLastInsertedId_using_InsertParam:
with InsertParam
Expected: greater than 0
But was: 0
答案 0 :(得分:3)
我调查了这个失败的单元测试,它与这个问题Why SCOPE_IDENTITY returns NULL?有关。 我做了一个pull request on OrmLite来解决这个问题。如果被接受,我会通知你。
Demis Bellot改变了我的解决方案,并在主分支中合并了一个修复程序。 InsertParam现在可以直接返回lastinsertedid。
public static long InsertParam<T>(this IDbConnection dbConn, T obj, bool selectIdentity = false)
现在可以在v3.9.58中找到