为了举例说明这个问题,我有一个简单的表,它的 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