Ошибка в 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