我突然从一个简单的EF查询中得到错误:
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.UInt64'.
at MySqlConnector.Core.Row.GetUInt64(Int32 ordinal) in /_/src/MySqlConnector/Core/Row.cs:line 282
at MySqlConnector.MySqlDataReader.GetUInt64(Int32 ordinal) in /_/src/MySqlConnector/MySqlDataReader.cs:line 316
at MySqlConnector.MySqlDataReader.GetFieldValue[T](Int32 ordinal) in /_/src/MySqlConnector/MySqlDataReader.cs:line 396
at Microsoft.EntityFrameworkCore.Query.Internal.BufferedDataReader.
我对对象本身没有做任何更改,模式和以前一样同步,完全符合预期,唯一可能的字段是ulong
和ulong?
(BIGINT UNSIGNED
),并正确Map到对象。
然而,当我调用投影(.select = new SameObject { ... }
)时,转换错误不会出现。
两个问题:
1.在这种情况下,是否有一些低级的调试方法可以至少找到相关的列名?(我检查了异常类型,没有发现任何特定的内容)
1.为什么当我调用await ctx.MyTable.ToListAsync()
时会出现错误,而当我使用上述await ctx.MyTable.Select(x => new MyTableObject { ...set properties manually... }).ToListAsync()
投影时却不会?
版本号:
.net: 7.0.401
nuget Pomelo.EntityFrameworkCore.MySql: 7.0.0
nuget MySql.Data: 8.1.0
MySql 8.0.34
nuget EF: 7.0.11
1条答案
按热度按时间0kjbasz61#
您的模型类必须与表完全相同,因此请检查可空类型。尝试添加Nullable类型(?)添加到您的模型类中。
如果你已经这样做了,在你的投影上,试着用
Convert.IsDBNull()
检查所有的属性。您可以在Select
中使用此方法。它将帮助您定位空引用的属性。