使用InsertParam时ServiceStack.OrmLite.SqlServer和GetLastInsertId中的错误?

时间:2013-08-07 16:30:36

标签: sql-server servicestack ormlite-servicestack

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

1 个答案:

答案 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中找到