Невозможно привести объект типа «System.Int32» к типу «System.Int16», но схема как в SQL, так и в C# с использованием inC#

Место общения программистов C#
Ответить
Anonymous
 Невозможно привести объект типа «System.Int32» к типу «System.Int16», но схема как в SQL, так и в C# с использованием in

Сообщение Anonymous »

Кажется, я столкнулся с чем-то, что кажется мне немного странным, и из-за чего chatgpt аварийно завершает работу, думая об этом.
У меня есть подход к базе данных SQL Server, основанный на коде, с использованием Entity Framework Core. В одной из моих таблиц я храню отчеты. В таблице есть только один тип столбца, который является числовым значением. Столбец называется KsrsId и определяется как int16.
Когда я запускаю следующий простой код, я получаю исключение при попытке привести int32 к int16. Обратите внимание: Id — это руководство:

Код: Выделить всё

var report = await ReportingDbContext.Reports
.AsNoTracking()
.FirstOrDefaultAsync(x => x.Id == id);
При этом генерируется следующее исключение:

System.InvalidCastException: невозможно привести объект типа «System.Int32» к типу «System.Int16».
в Microsoft.Data.SqlClient.SqlBuffer.get_Int16()

at Microsoft.Data.SqlClient.SqlDataReader.GetInt16(Int32 i)

atlambda_method215(Closure, QueryContext, DbDataReader, ResultContext, SingleQueryResultCoordinator)

at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable

Код: Выделить всё

1.AsyncEnumerator.MoveNextAsync()   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable
1 asyncEnumerable, CancellationToken cancelToken)

в Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancelToken)

Что я проверил
  • Очевидное: свойство KsrsId класса C# Report KsrsId определяется как int16/short, что и есть
  • Схема SQL Server показывает, что тип smallint
  • Текущий снимок, созданный EF Core и отображаемый

    Код: Выделить всё

    b.Property("KsrsId").HasColumnType("smallint");
    
Я также проверил, не смотрю ли я на другой сервер или что-то в этом роде.
Я немного растерян и растерян. Почему EF Core (я предполагаю, что это EF Core) думает, что получил int32 от SQL Server?
Обновление: Просто добавлю: я попробовал выполнить запрос выбора для каждого свойства, и исключение возникло только в этом запросе

Код: Выделить всё

await ctx.Reports.Where(r => r.Id == id).Select(r => new { r.KsrsId }).FirstOrDefaultAsync();


Подробнее здесь: https://stackoverflow.com/questions/797 ... t-schema-i
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»