我有一个公开api的.NET Core Web服务。它有一个如下所示的数据库表。
CREATE TABLE Employee
(
Id INT NOT NULL IDENTITY(1,1),
[Name] VARCHAR(100) NOT NULL,
Points FLOAT NOT NULL,
CONSTRAINT [PK_Employee] PRIMARY KEY NONCLUSTERED ([Id] ASC )
)
这个表的脚手架编码如下。
public partial class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public double Points { get; set; }
}
此课程的使用情况如下。
var employees = context.Employee.ToList();
此代码运行正常,客户很少。到目前为止一切都很好。
当开始为相同应用程序的第2版工作时,我意识到存储在Points列中的数据不需要任何精度,它实际上可以适合tinyint范围。因此,我将版本2的数据类型更改为tinyint,但我们仍然让客户使用应用程序的版本1。版本2中的类现在看起来如下,Points列的类型为byte。
public partial class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public byte Points { get; set; }
}
有了这个改变,我的想法是,由于表中包含的数据实际上都在tinyint的范围内,因此版本1代码库不应该有任何问题。但是现在应用程序版本1代码在执行以下行时遇到异常。
var employees = context.Employee.ToList();
以下是例外情况。
Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory - 迭代查询结果时数据库中发生异常。 System.InvalidOperationException:发生异常时 读取属性“Employee.Points”的数据库值。预期的 type是'System.Double'但实际值是类型 'System.Byte'。 ---> System.InvalidCastException:无法转换对象 类型'System.Byte'键入'System.Double'。在 Microsoft.EntityFrameworkCore.Metadata.Internal.EntityMaterializerSource.TryReadValue [TValue](ValueBuffer valueBuffer,Int32 index,IPropertyBase property)---内部结束 异常堆栈跟踪--- at Microsoft.EntityFrameworkCore.Metadata.Internal.EntityMaterializerSource.ThrowReadValueException [TValue](例外 异常,对象值,IPropertyBase属性)at Microsoft.EntityFrameworkCore.Metadata.Internal.EntityMaterializerSource.TryReadValue [TValue](ValueBuffer valueBuffer,Int32 index,IPropertyBase property)at lambda_method(Closure,ValueBuffer)at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.UnbufferedEntityShaper
1.Shape(QueryContext queryContext, ValueBuffer valueBuffer) at Microsoft.EntityFrameworkCore.Query.AsyncQueryMethodProvider.<>c__DisplayClass3_0
1&LT; _ShapedQuery&GT; b__0(ValueBuffer vb)at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable2.SelectAsyncEnumerator.<MoveNext>d__4.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable
2.SelectAsyncEnumerator.d__4.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)
据我所知,从double到byte的转换会导致数据丢失,但在这种情况下,他表中的所有值都在1到5之间。我的思路在哪里错了?