当数据在

时间:2017-11-01 19:31:05

标签: .net-core entity-framework-core .net-core-1.1

我有一个公开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'。 ---&GT; 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.SelectAsyncEnumerable 2.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之间。我的思路在哪里错了?

0 个答案:

没有答案