DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.36k stars 1.34k forks source link

类型转化的处理疑问 #1277

Closed chenlike closed 3 months ago

chenlike commented 3 months ago

起因是 我数据库中的字段类型为nvarchar在C# 的代码中定义的类型为long?

[SugarColumn(ColumnName = "current_approve_user_name")]
public long? CurrentApproveUserName { get; set; }

使用SqlQueryable方法进行查询时会报一个

SqlSugar.SqlSugarException:“中文提示 : Select 实体与表映射出错,可以注释实体类中的字段排查具体哪一个字段。【注意:如果用CodeFirt先配置禁止删列或更新】 Common Language Runtime detected an invalid program.
English Message : Entity mapping error.Common Language Runtime detected an invalid program.”

看了代码后发现是这边的处理有问题 https://github.com/DotNetNext/SqlSugar/blob/39c6f2ce321d3b217d40174e522de9807fc4d1d5/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs#L371-L375

这块是对一些不支持转化类型进行抛出错误,但是像

https://github.com/DotNetNext/SqlSugar/blob/39c6f2ce321d3b217d40174e522de9807fc4d1d5/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs#L329-L335

没有进行处理 导致报了个不明不白的错误

  1. 是否应该补全这类类型的判断? 加上判断的类型后就能在throw错误的时候精确告知原因了
  2. 其实在数据库中是nvarchar很多时候也是可以直接转化为long?, 是否要实现对string转化为各种数字类型的兼容
DotNetNext commented 3 months ago

https://www.donet5.com/Home/Doc?typeId=2542 使用自定义转换 默认不支持反向转换,考虑数据安全性。

chenlike commented 3 months ago

那建议把一些缺失的数字类型加上,不然排查问题实在有点麻烦

DotNetNext commented 3 months ago

高版本正常都能提示哪个出错了,你说一下是什么库 ,数据字段是什么, 实体是什么,我试着模拟一下

chenlike commented 3 months ago

https://github.com/chenlike/SqlSugar-issues1277 fork的是最新的master分支 设置启动项Src\Asp.NetCore2\ConsoleApp1 就能复现 . 创建表的sql也在ConsoleApp1里面

Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) 
Sep 24 2019 13:48:23 
Copyright (C) 2019 Microsoft Corporation
Developer Edition (64-bit) on Windows 10 Education 10.0 <X64> (Build 19045: ) (Hypervisor)

image

DotNetNext commented 3 months ago

源码已修复 ,后面NUGET发布更新就行了