使用GUID跟踪Cookie活动时遇InvalidCastException类型转换错误求助
解决InvalidCastException: Decimal转Int64的问题
这个错误其实很常见,大概率是你的EF Core实体类和数据库表的字段类型不匹配导致的,我给你一步步拆解解决思路:
先定位问题根源
错误提示InvalidCastException: Unable to cast object of type 'System.Decimal' to type 'System.Int64',说明EF在查询数据库时,把某个decimal类型的字段往实体类的long(也就是Int64)属性上转,转不动就报错了——和你写的GUID解析逻辑没关系,是其他字段的锅。
具体解决步骤
第一步:核对实体类和数据库字段类型
打开你的Upload_Transaction实体类,再打开数据库里对应的表,逐字段对比类型。比如如果实体类里有个public long Id { get; set; },但数据库里Id字段是decimal(18,0),这就完全对不上了。
解决办法二选一:- 把实体类里的属性改成
decimal类型,比如public decimal Id { get; set; } - 如果数据库字段应该是整数,就把数据库里的字段改成
bigint(对应C#的long)
- 把实体类里的属性改成
第二步:确认GUID查询逻辑的完整性
你贴的代码里查询语句没写完,完整的应该是这样的,顺便检查Cookie_GUID的类型是否匹配:string Cookies2 = Request.Cookies["Upload_Guid"].ToString(); Guid Cookie_Guid = Guid.Parse(Cookies2); // 获取Cookie值并解析为GUID var GID_Variable = await _context.Upload_Transaction.SingleOrDefaultAsync(m => m.Cookie_GUID == Cookie_Guid);要保证实体类的
Cookie_GUID是Guid类型,数据库里对应的字段是uniqueidentifier,避免这里再出类型问题。第三步:同步实体类和数据库(如果用EF迁移)
要是你用的是Code First模式,修改实体类后需要更新迁移:Add-Migration FixDecimalLongMismatch Update-Database手动改数据库字段的话,直接在数据库管理工具里调整就行。
额外排查小技巧
- 可以用EF Core的日志功能,打印出实际执行的SQL语句,看看查询时到底是哪个字段触发了类型转换错误。
- 检查有没有用Data Annotation或者Fluent API错误配置字段类型,比如给long属性加了
[Column(TypeName = "decimal")]这种矛盾的配置。
内容的提问来源于stack exchange,提问作者Ehi
相关产品推荐
相关产品推荐

