Dapper генерирует исключение при втором запуске запроса, если схема результатов отличается
Я использую Dapper, Sqlite на C# coreclr.
public async Task<UserPoco> GetFromEmail(string email)
{
email = email.ToLower();
using (var connection = new SqliteConnection(_configSettings.ConnectionString))
{
connection.Open();
var query = $"SELECT * FROM users WHERE EmailAddress = '{email}';";
var result = await connection.QueryAsync<UserPoco>(query);
return result.FirstOrDefault();
}
}
Этот простой метод генерирует исключение, если в какой-то момент запрос SQL не находит результатов и при следующем запуске он находит результаты. Выдает: Невозможно привести объект типа "System.Int64" к типу "System.Int32". Ошибка при разборе столбца 0 (UserId=86 - Int64)
Я уверен, что это не связано с типами данных. UserPoco имеет длинное свойство UserId, а пользователи таблицы БД имеют UserId типа INTEGER, который рекомендуется для хранения bigint (long). Более того, например, если метод всегда находит данные, он будет работать как шарм. Я думаю, что это связано с тем фактом, что Dapper кэширует результирующую схему каждого запроса, который он выполняет, и выдает исключение, когда эта схема изменяется для того же запроса, на который они указывают: https://github.com/janjosephlim/dapper-dot-net/issues/124
Я не понимаю, почему я не могу найти больше информации об этом или больше людей жалуются на такой распространенный сценарий: я просто запускаю очень простой запрос несколько раз, который может возвращать или не давать результаты.
Что мне не хватает?
1 ответ
Я не знаю, почему sqlite неверно сообщает тип данных, но: проверки типов данных были улучшены в последних сборках перед выпуском. Пожалуйста, сверьтесь с последней предварительной версией: Я думаю, она уже исправлена.