0

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

1 回答 1

3

我调查了这个失败的单元测试,它与这个问题有关为什么 SCOPE_IDENTITY 返回 NULL?. 我已经在 OrmLite 上提出了一个拉取请求来解决这个问题。如果它被接受,我会通知你。

Demis Bellot 更改了我的解决方案并在主分支中合并了一个修复程序。InsertParam 现在可以直接返回 lastinsertedid。

public static long InsertParam<T>(this IDbConnection dbConn, T obj, bool selectIdentity = false)

现在在 v3.9.58 中可用

于 2013-08-09T10:38:14.747 回答