У меня есть подход к базе данных 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в 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
Мобильная версия