DotNetNext/SqlSugar

类型转化的处理疑问

Closed this issue · 5 comments

起因是 我数据库中的字段类型为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.”

看了代码后发现是这边的处理有问题

case CSharpDataType.@string:
if (this.Context.CurrentConnectionConfig.DbType != DbType.Oracle)
{
CheckType(bind.StringThrow, bindProperyTypeName, validPropertyName, propertyName);
}

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

  • long
  • short
  • sbyte
  • short
  • uint
  • 等等这类....

public virtual List<string> StringThrow
{
get
{
return new List<string>() { "int32", "datetime", "decimal", "double", "byte" };
}
}

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

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

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

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

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

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

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