0

問題を例示するために、AUTOINCREMENT である PK を持つ単純なテーブルがあります。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 のソース コードを表示すると、クラス InsertParam_GetLastInsertId とテスト ケース Can_GetLastInsertedId_using_InsertParam が表示されます。主張するべきだと思いますか?

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 に答える