Ошибка в ServiceStack.OrmLite.SqlServer и GetLastInsertId при использовании InsertParam?

Чтобы проиллюстрировать проблему, у меня есть простая таблица с 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, я вижу класс 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

1 ответ

Я исследовал этот неудачный модульный тест, и он связан с этим вопросом. Почему SCOPE_IDENTITY возвращает NULL?, Я сделал запрос на OrmLite, чтобы исправить это. Я буду держать вас в курсе, если это будет принято.

Демис Белло изменил мое решение и слил исправление в основной ветке. InsertParam теперь может напрямую возвращать lastinsertedid.

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

Это теперь доступно в v3.9.58

Другие вопросы по тегам